EventSourcing klingt nach dem Muster, nach dem Sie suchen.
Nehmen wir ein Beispiel mit einem einfachen "Auto" -Objekt, dessen Farbe wir verfolgen möchten (Pseudo-C # -Code folgt).
public class Car {
public string Color { get; set; }
public Car() { this.Color = "Blue"; }
}
Bei einer CRUD-Implementierung würde die vorherige Farbe verloren gehen, wenn wir die Farbe des Autos aktualisieren.
MyCar.Color = "Red";
MyCar.Save(); // Persist the update to the database and lose the previous data
Dieser Informationsverlust scheint mir das zu sein, was Sie am liebsten vermeiden möchten (daher die Abneigung gegen das Aktualisieren und Löschen eines Teils des CRUD-Musters).
Wenn wir die Fahrzeugklasse umschreiben würden, um stattdessen auf Ereignisse zu reagieren, wenn die Änderung aktualisiert wird, könnte dies so aussehen:
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;
}
}
Wie würden wir nun die Farbe dieses Objekts aktualisieren? Wir könnten ein CarColorChanged- Event erstellen !
var evnt = new CarColorChangedEvent("Red");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Bemerken Sie das Fehlen eines Speichers für das tatsächliche Modellobjekt? Das liegt daran, dass wir das Modell nicht direkt beibehalten, sondern die Ereignisse beibehalten, die das Modell in den aktuellen Zustand versetzen. Diese Ereignisse sollten sein unveränderlich sein .
Lassen Sie uns jetzt einen schnellen Vorlauf durchführen und die Farbe noch einige Male ändern:
var evnt = new CarColorChangedEvent("Green");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
var evnt = new CarColorChangedEvent("Purple");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Wenn wir uns unseren Ereignisspeicher ansehen würden (könnte eine Beziehungsdatenbank sein, dateibasiert usw.), würden wir eine Reihe von Ereignissen sehen, die sich auf unser Autoobjekt beziehen:
CarColorChangedEvent => Red
CarColorChangedEvent => Green
CarColorChangedEvent => Purple
Wenn wir dieses Autoobjekt neu erstellen möchten, können wir dies einfach tun, indem wir ein neues Autoobjekt erstellen und die Ereignisse aus unserem Veranstaltungsspeicher auf dieses Objekt anwenden.
var MyCar = new Car();
var events = MyDatabase.SelectEventsForCar("CarIdentifierHere");
foreach(var e in events) {
MyCar.ApplyEvent(e);
}
Console.WriteLine(MyCar.Color); // Purple
Mit dem Ereignisstrom können wir den Zustand des Autos auf einen früheren Zeitraum zurücksetzen, indem wir einfach ein neues Autoobjekt erstellen und nur die gewünschten Ereignisse anwenden:
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?
Klar gibt es: CR; P