EventSourcing ressemble au modèle que vous recherchez peut-être.
Prenons un exemple en utilisant un simple objet "voiture" dont nous voudrions garder la trace de la couleur (un pseudo code C # suit).
public class Car {
public string Color { get; set; }
public Car() { this.Color = "Blue"; }
}
Avec une implémentation CRUD lorsque nous mettons à jour la couleur de la voiture, la couleur précédente serait perdue.
MyCar.Color = "Red";
MyCar.Save(); // Persist the update to the database and lose the previous data
Cette perte d'informations me semble être ce que vous aimeriez éviter le plus (d'où l'aversion pour la mise à jour et la suppression d'une partie du modèle CRUD).
Si nous devions réécrire la classe de voiture pour répondre aux événements lors de la mise à jour de sa modification, cela pourrait ressembler à ceci:
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;
}
}
Maintenant, comment pourrions-nous mettre à jour la couleur de cet objet? Nous pourrions créer un événement CarColorChanged !
var evnt = new CarColorChangedEvent("Red");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Remarquez l'absence d'une sauvegarde sur l'objet de modèle réel? En effet, au lieu de persister directement le modèle, nous persistons les événements qui mettent le modèle à l'état actuel. Ces événements devraient être immuables .
Maintenant, avançons rapidement et changeons la couleur plusieurs fois:
var evnt = new CarColorChangedEvent("Green");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
var evnt = new CarColorChangedEvent("Purple");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Si nous regardions notre stockage d'événements (pourrait être une base de données de relations, basée sur un fichier, etc.), nous verrions une série d'événements liés à notre objet voiture:
CarColorChangedEvent => Red
CarColorChangedEvent => Green
CarColorChangedEvent => Purple
Si nous voulions reconstruire cet objet de voiture, nous pourrions le faire simplement en créant un nouvel objet de voiture et en appliquant les événements de notre magasin d'événements audit objet.
var MyCar = new Car();
var events = MyDatabase.SelectEventsForCar("CarIdentifierHere");
foreach(var e in events) {
MyCar.ApplyEvent(e);
}
Console.WriteLine(MyCar.Color); // Purple
Avec le flux d'événements, nous pouvons restaurer l'état de la voiture à une période antérieure simplement en créant un nouvel objet voiture et en appliquant uniquement les événements que nous voulons:
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?
Bien sûr, il y a: CR; P