EventSourcing suena como el patrón que puede estar buscando.
Tomemos un ejemplo usando un simple objeto "auto" del que nos gustaría hacer un seguimiento del color (pseudo código C # sigue).
public class Car {
public string Color { get; set; }
public Car() { this.Color = "Blue"; }
}
Con una implementación CRUD cuando actualizamos el color del automóvil, el color anterior se perdería.
MyCar.Color = "Red";
MyCar.Save(); // Persist the update to the database and lose the previous data
Esta pérdida de información me parece lo que más le gustaría evitar (de ahí la aversión por la actualización y eliminación de parte del patrón CRUD).
Si tuviéramos que reescribir la clase de automóvil para responder a los eventos al actualizar su cambio, podría verse así:
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;
}
}
Ahora, ¿cómo actualizaríamos el color de este objeto? ¡Podríamos crear un evento CarColorChanged !
var evnt = new CarColorChangedEvent("Red");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
¿Notó la falta de un guardado en el objeto modelo real? Esto se debe a que en lugar de persistir directamente en el modelo, persistimos los eventos que ponen el modelo en el estado actual. Estos eventos deberían ser inmutables .
Ahora avancemos y cambiemos el color varias veces más:
var evnt = new CarColorChangedEvent("Green");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
var evnt = new CarColorChangedEvent("Purple");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Si tuviéramos que mirar nuestro almacenamiento de eventos (podría ser una base de datos de relaciones, basada en archivos, etc.) veríamos una serie de eventos relacionados con el objeto de nuestro automóvil:
CarColorChangedEvent => Red
CarColorChangedEvent => Green
CarColorChangedEvent => Purple
Si quisiéramos reconstruir ese objeto de automóvil, podríamos hacerlo simplemente creando un nuevo objeto de automóvil y aplicando los eventos de nuestro almacén de eventos a dicho objeto.
var MyCar = new Car();
var events = MyDatabase.SelectEventsForCar("CarIdentifierHere");
foreach(var e in events) {
MyCar.ApplyEvent(e);
}
Console.WriteLine(MyCar.Color); // Purple
Con la secuencia de eventos, podemos retroceder el estado del automóvil a un período de tiempo anterior simplemente creando un nuevo objeto de automóvil y solo aplicamos los eventos que deseamos:
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?
Claro que sí: CR; P