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パターンの一部を更新および削除することが嫌いです)。
変更を更新するときに代わりにイベントに応答するようにcarクラスを書き直すと、次のようになります。
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