2017-09-11 4 views
1

ようOrderEventHandlerクラスが見えるように私はむしろCommandBus別々とEventBusともICommandHandler<TCommand>IEventHandler<TCommand>を持っているでしょう:CQRS実装のためにMasstransitをラップするのは良い方法ですか?

public class OrderEventHandler : 
    IEventHandler<OrderPlaced>, 
    IEventHandler<OrderRegistrantAssigned>, 
    IEventHandler<OrderTotalsCalculated>, 
    IEventHandler<OrderConfirmed>, 
    IEventHandler<OrderExpired>, 
    IEventHandler<SeatAssignmentsCreated>, 
    IEventHandler<SeatAssigned>, 
    IEventHandler<SeatAssignmentUpdated>, 
    IEventHandler<SeatUnassigned> 
{ 
    public void Handle(OrderPlaced @event){...} 
    . 
    . 
    . 
} 

可能な解決策はMasstransitインフラと私のCQRS(のようなConsumerToHandlerAdopter<T>のみの間で採用を提供することができます私が一般的に必要とするコンテキストの詳細を公開します)。

しかし、私はMasstransitを初めて使っているので、私は後で対処しなければならないかもしれない問題の周りに頭を浮かべることはできません。

だから私の質問は:私は私自身のインフラストラクチャに対処するよう は、それは一般的に価値がMasstransitをラップしていますか?

答えて

2

私たちは、MassQransitを使用してCRQSを広範囲に実装していますが、コマンド処理のためにのみ使用しています。

メッセージングインフラストラクチャを使用して書き込みモデルと読み取りモデルを同期させない理由は、何度も説明されています。主な理由は、変化を持続させ、イベントを公開しないということです。これは、インフラストラクチャの2つの異なる部分であるためです。 DTCのようなものを使用しない限り、モデル間の一貫性を保証することはできません。

また、この時点では、「神ハンドラ」クラスから離れていることも好きです。 MassTransitは、個々の消費者を別々のクラスに分けることによってSRP(単一責任の原則)を実施することに特に優れています。

一般的なドメインイベントベースの統合(リアクティブイベント処理)では、MassTransitも使用します。

また、複数のメッセージ・インターフェースを実装するイベントを持つことができ、これによって、あなたはより包括的なイベント処理があります:

public interface CustomerRegistered 
{ 
    string FullName { get; } 
} 

public interface OrderPlaced 
{ 
    string Reference { get; } 
    List<OrderLine> Lines { get; } 
} 

public class NewCustomerOrderedStuff : CustomerRegistered, OrderPlaced 
{ 
... 
} 

public class CustomerRegisteredConsumer : IConsumer<CustomerRegistered> 

public class OrderPlacedConsumer : IConsumer<OrderPlaced> 

をそして、それらの消費者のそれぞれが異なる懸念がありますし、囲まれた独立した中で生きることができます文脈(サービス)。

+0

ありがとうございます@Alexey Zimarev、私は輸送層としてrabbitmqを使用しています。私は、集計をサガで表現することと、一貫性があるときはいつでも、aggregate.method()を呼び出して返されたイベントを公開することを目指していました。特定の状態になった後で集約は必要ないので、削除することができます。 – Mohsen

+1

私は集団としてサガを使用するいくつかのプロジェクトを持っています。これはかなりうまくいくが、別々の読み書きモデルはない。同時に、私はEventStore https://github.com/alexeyzimarev/MassTransit.EventStoreIntegrationのサガ・パーシスタンスを作成しました。これを使用することで、EventSourceサガを使用して、EventStore経由で接続された投影を使用して読み込みモデルを構築できますキャッチアップサブスクリプション。 –

+0

誰かがそれをやったのを見るのはうれしいですが、イベントストア(または何らかのバッチイベントのパブリッシング)を持っていないという問題は、あなたが言及したように部分的に起こった事実を公表するかもしれないということです。すべてのファクトが正常に公開されている場合は、状態をチェックして変更することで管理することができます(Ifはドメインに適合します)。 – Mohsen

関連する問題