EventSourcing sembra il modello che potresti cercare.
Facciamo un esempio usando un semplice oggetto "auto" di cui vorremmo tenere traccia del colore (segue il codice pseudo C #).
public class Car {
public string Color { get; set; }
public Car() { this.Color = "Blue"; }
}
Con un'implementazione CRUD quando aggiorniamo il colore dell'auto, il colore precedente andrebbe perso.
MyCar.Color = "Red";
MyCar.Save(); // Persist the update to the database and lose the previous data
Questa perdita di informazioni mi sembra ciò che vorresti evitare di più (da qui la antipatia per l'aggiornamento e l'eliminazione di parte del modello CRUD).
Se dovessimo riscrivere la classe dell'auto per rispondere invece agli eventi durante l'aggiornamento della sua modifica, potrebbe apparire così:
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;
}
}
Ora come potremmo aggiornare il colore di questo oggetto? Potremmo creare un evento CarColorChanged !
var evnt = new CarColorChangedEvent("Red");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Notare la mancanza di un salvataggio sull'oggetto modello reale? Questo perché invece di persistere direttamente nel modello persistiamo gli eventi che mettono il modello allo stato attuale. Questi eventi dovrebbero essere immutabili .
Ora andiamo avanti velocemente e cambiamo colore più volte:
var evnt = new CarColorChangedEvent("Green");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
var evnt = new CarColorChangedEvent("Purple");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Se dovessimo guardare il nostro archivio eventi (potrebbe essere un database di relazioni, basato su file, ecc.) Vedremmo una serie di eventi relativi al nostro oggetto auto:
CarColorChangedEvent => Red
CarColorChangedEvent => Green
CarColorChangedEvent => Purple
Se volessimo ricostruire quell'oggetto auto, potremmo farlo semplicemente creando un nuovo oggetto auto e applicando gli eventi dal nostro negozio di eventi a detto oggetto.
var MyCar = new Car();
var events = MyDatabase.SelectEventsForCar("CarIdentifierHere");
foreach(var e in events) {
MyCar.ApplyEvent(e);
}
Console.WriteLine(MyCar.Color); // Purple
Con il flusso di eventi possiamo ripristinare lo stato dell'auto a un periodo di tempo precedente semplicemente creando un nuovo oggetto auto e applicare solo gli eventi che vogliamo:
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?
Certo che c'è: CR; P