web-dev-qa-db-ja.com

イベントソーシング:集約ルートとプロジェクションをマージしますか?

私は、イベントソーシングベースのアーキテクチャのコンセプトに頭を悩ませています。

私の理解では、投影はある時点での状態の表現です。実際、それはその状態に至ったイベントの集合です。プロジェクションは、クエリの目的でデータストアに格納されています。

集計とプロジェクションの両方がイベントのストリームから「再構築」されているので、なぜそれらを単一のコードにマージしないのですか?

私は責任があるクラスになるでしょう:

  • 適用されたイベントに基づいて(内部)状態を更新する
  • 状態を変更するように求められたときに新しいイベントを作成する

たとえば、製造オーダーです。イベントを保存し、それらを予測にディスパッチしてから、予測を保存するインフラストラクチャがあると仮定します

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));
        }
    }
}
5
Mike

集約とプロジェクションの両方がイベントのストリームから「再構築」されているので、なぜそれらを単一のコードにマージしないのですか?

彼らには異なる責任があるからです。

集約は、イベントのストリームを拡張する方法を管理します。その中核は、このストリームへの変更を管理するビジネスルールの現在のコレクションです。

しかし、予測は興味深いクエリのユースケースをサポートするビューです。彼らはどんな未来が可能であるかを支配するビジネスルールに興味を持っておらず、過去をどのように表すかを理解することだけに関心があります。

それらは同じ方法で供給されます。また、一般的なコンポーネントを使用して記録簿から履歴を抽出することもできますが、ユースケースのサポートに使用されるデータ構造は異なる可能性があります。

たとえば、ドメイン内のエンティティ間の関係をクエリする必要があるユースケースがある場合、おそらくイベントストアからではなく、グラフデータベースからそれらのクエリを処理することになります。コース用の馬。

5
VoiceOfUnreason

集計とプロジェクションの両方がイベントのストリームから「再構築」されているので、なぜそれらを単一のコードにマージしないのですか?

CQRSについて話すので、(少なくとも)2つの別々のオブジェクトを作成する必要があります:

CQRSは、以前は1つしかなかった2つのオブジェクトの作成です( Greg Young

0