EventSourcing terdengar seperti pola yang mungkin Anda cari.
Mari kita ambil contoh menggunakan objek "mobil" sederhana yang ingin kita pantau warna (kode pseudo C # berikut).
public class Car {
public string Color { get; set; }
public Car() { this.Color = "Blue"; }
}
Dengan implementasi CRUD ketika kami memperbarui warna mobil, warna sebelumnya akan hilang.
MyCar.Color = "Red";
MyCar.Save(); // Persist the update to the database and lose the previous data
Hilangnya informasi ini menurut saya seperti yang paling ingin Anda hindari (karena itu tidak suka dengan pembaruan dan menghapus bagian dari pola CRUD).
Jika kami menulis ulang kelas mobil untuk merespons acara saat memperbarui perubahannya, itu mungkin terlihat seperti ini:
public class Car {
public string Color { get; private set; } // Cannot be set from outside the class
public void ApplyEvent(CarColorChangedEvent e) {
this.Color = e.Color;
}
}
Sekarang bagaimana kita memperbarui warna objek ini? Kita bisa membuat acara CarColorChanged !
var evnt = new CarColorChangedEvent("Red");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Perhatikan kurangnya save pada objek model yang sebenarnya? Itu karena alih-alih mempertahankan model secara langsung, kami tetap menggunakan peristiwa yang menempatkan model ke kondisi saat ini. Peristiwa ini harus abadi .
Sekarang mari kita maju cepat dan mengubah warna beberapa kali lagi:
var evnt = new CarColorChangedEvent("Green");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
var evnt = new CarColorChangedEvent("Purple");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Jika kita melihat penyimpanan acara kita (bisa berupa basis data hubungan, berbasis file, dll.) Kita akan melihat serangkaian acara yang berkaitan dengan objek mobil kita:
CarColorChangedEvent => Red
CarColorChangedEvent => Green
CarColorChangedEvent => Purple
Jika kami ingin membangun kembali objek mobil itu, kami dapat melakukannya hanya dengan membuat objek mobil baru dan menerapkan peristiwa dari toko acara kami ke objek tersebut.
var MyCar = new Car();
var events = MyDatabase.SelectEventsForCar("CarIdentifierHere");
foreach(var e in events) {
MyCar.ApplyEvent(e);
}
Console.WriteLine(MyCar.Color); // Purple
Dengan aliran peristiwa, kita dapat memutar kembali keadaan mobil ke periode waktu sebelumnya hanya dengan membuat objek mobil baru dan hanya menerapkan peristiwa yang kita inginkan:
var MyCar = new Car();
var event = MyDatabase.GetFirstEventForCar("CarIdentifierHere");
MyCar.ApplyEvent(e);
Console.WriteLine(MyCar.Color); // Red
Is there a term for this? Basically only creating and reading data?
Tentu ada: CR; P