EventSourcing , aradığınız desen gibi geliyor.
Rengi takip etmek istediğimiz basit bir "araba" nesnesini kullanarak bir örnek alalım (sözde C # kodu aşağıdadır).
public class Car {
public string Color { get; set; }
public Car() { this.Color = "Blue"; }
}
Aracın rengini güncellediğimizde bir CRUD uygulamasıyla önceki renk kaybolacaktı.
MyCar.Color = "Red";
MyCar.Save(); // Persist the update to the database and lose the previous data
Bu bilgi kaybı bana en çok kaçınmak istediğiniz şey gibi geliyor (bu nedenle güncellemeden hoşlanmama ve CRUD modelinin bir kısmını silme).
Araç sınıfını, değişikliğini güncellerken olaylara yanıt vermek için yeniden yazacak olsaydık, şöyle görünebilir:
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;
}
}
Şimdi bu nesnenin rengini nasıl güncelleyeceğiz? Bir CarColorChanged etkinliği oluşturabiliriz !
var evnt = new CarColorChangedEvent("Red");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Gerçek model nesnesinde kaydetme eksikliğine dikkat edin? Çünkü modeli doğrudan sürdürmek yerine, modeli mevcut duruma getiren olayları devam ettiriyoruz. Bu olaylar değişmez olmalıdır .
Şimdi hızlıca ilerleyelim ve rengi birkaç kez daha değiştirelim:
var evnt = new CarColorChangedEvent("Green");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
var evnt = new CarColorChangedEvent("Purple");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Etkinlik depolama alanımıza bakacak olsaydık (bir ilişki veritabanı, dosya tabanlı, vb. Olabilir), araç neslimizle ilgili bir dizi olay görürüz:
CarColorChangedEvent => Red
CarColorChangedEvent => Green
CarColorChangedEvent => Purple
O araba nesnesini yeniden inşa etmek istersek, bunu sadece yeni bir araba nesnesi oluşturarak ve olayları olay mağazamızdan bahsedilen nesneye uygulayarak yapabilirdik.
var MyCar = new Car();
var events = MyDatabase.SelectEventsForCar("CarIdentifierHere");
foreach(var e in events) {
MyCar.ApplyEvent(e);
}
Console.WriteLine(MyCar.Color); // Purple
Olay akışı ile, sadece yeni bir araba nesnesi oluşturarak ve sadece istediğimiz olayları uygulayarak aracın durumunu önceki bir zaman dilimine geri alabiliriz:
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?
Tabii var: CR; P