EventSourcing звучит как шаблон, который вы, возможно, ищете.
Давайте рассмотрим пример, использующий простой объект «car», который мы хотели бы отслеживать цвета (псевдо-код C # следует).
public class Car {
public string Color { get; set; }
public Car() { this.Color = "Blue"; }
}
При реализации CRUD при обновлении цвета автомобиля предыдущий цвет будет потерян.
MyCar.Color = "Red";
MyCar.Save(); // Persist the update to the database and lose the previous data
Эта потеря информации звучит для меня как то, чего вы хотели бы избежать больше всего (отсюда неприязнь к обновлению и удалению части шаблона CRUD).
Если бы мы переписали класс автомобиля, чтобы вместо этого реагировать на события при обновлении его изменения, это может выглядеть так:
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;
}
}
Теперь, как бы мы обновили цвет этого объекта? Мы могли бы создать событие CarColorChanged !
var evnt = new CarColorChangedEvent("Red");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Заметили отсутствие сохранения на реальном объекте модели? Это потому, что вместо того, чтобы сохранять модель напрямую, мы сохраняем события, которые переводят модель в текущее состояние. Эти события должны быть неизменными .
Теперь давайте перенесемся и изменим цвет еще несколько раз:
var evnt = new CarColorChangedEvent("Green");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
var evnt = new CarColorChangedEvent("Purple");
MyEventStore.save(evnt);
MyCar.ApplyEvent(evnt);
Если бы мы посмотрели на наше хранилище событий (это может быть база данных отношений, на основе файлов и т. Д.), Мы бы увидели серию событий, связанных с нашим автомобильным объектом:
CarColorChangedEvent => Red
CarColorChangedEvent => Green
CarColorChangedEvent => Purple
Если бы мы хотели восстановить этот автомобильный объект, мы могли бы сделать это, просто создав новый автомобильный объект и применив события из нашего хранилища событий к указанному объекту.
var MyCar = new Car();
var events = MyDatabase.SelectEventsForCar("CarIdentifierHere");
foreach(var e in events) {
MyCar.ApplyEvent(e);
}
Console.WriteLine(MyCar.Color); // Purple
С потоком событий мы можем откатить состояние автомобиля до предыдущего периода времени просто путем создания нового объекта автомобиля и применять только те события, которые мы хотим:
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?
Конечно, есть: CR; P