EventSourcing звучить як зразок, який ви можете шукати.
Візьмемо приклад, використовуючи простий об’єкт «автомобіль», за яким ми хотіли б відстежувати колір (далі йде псевдо 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