私は、イベントソーシングベースのアーキテクチャのコンセプトに頭を悩ませています。
私の理解では、投影はある時点での状態の表現です。実際、それはその状態に至ったイベントの集合です。プロジェクションは、クエリの目的でデータストアに格納されています。
集計とプロジェクションの両方がイベントのストリームから「再構築」されているので、なぜそれらを単一のコードにマージしないのですか?
私は責任があるクラスになるでしょう:
たとえば、製造オーダーです。イベントを保存し、それらを予測にディスパッチしてから、予測を保存するインフラストラクチャがあると仮定します
class Order: Aggregate {
private Guid _id;
private OrderState _state;
private DateTime _dateCreated;
private List<Item> _items = new List<Item>();
public Order()
{
// used when loading from projection data store (de-serializing from JSON for example)
}
public Order(Guid id, IEnumerable<Item> items)
{
// used when handling CreateOrder command,
// uses Aggregate.PublishEvent which appends the event to the stream
// the event dispatcher causes the event to be Applied as well
this.PublishEvent(new OrderCreated(id, items));
}
public void Apply(OrderCreated ev)
{
// event applied by event dispatcher, when reconstructing from events
this._id = ev.Id;
this._state = OrderState.New;
this._items = new List<Item>(ev.Items);
}
public void Ship()
{
// used when handling ShipOrder command
// incorporates business logic
if (this._state != OrderState.Shipped)
{
this.PublishEvent(new OrderShipped(this._id));
}
}
}
集約とプロジェクションの両方がイベントのストリームから「再構築」されているので、なぜそれらを単一のコードにマージしないのですか?
彼らには異なる責任があるからです。
集約は、イベントのストリームを拡張する方法を管理します。その中核は、このストリームへの変更を管理するビジネスルールの現在のコレクションです。
しかし、予測は興味深いクエリのユースケースをサポートするビューです。彼らはどんな未来が可能であるかを支配するビジネスルールに興味を持っておらず、過去をどのように表すかを理解することだけに関心があります。
それらは同じ方法で供給されます。また、一般的なコンポーネントを使用して記録簿から履歴を抽出することもできますが、ユースケースのサポートに使用されるデータ構造は異なる可能性があります。
たとえば、ドメイン内のエンティティ間の関係をクエリする必要があるユースケースがある場合、おそらくイベントストアからではなく、グラフデータベースからそれらのクエリを処理することになります。コース用の馬。
集計とプロジェクションの両方がイベントのストリームから「再構築」されているので、なぜそれらを単一のコードにマージしないのですか?
CQRSについて話すので、(少なくとも)2つの別々のオブジェクトを作成する必要があります:
CQRSは、以前は1つしかなかった2つのオブジェクトの作成です( Greg Young )