3

2 つのBounded Contextsがあるとすると、次のようになります。

  1. Fleet Mgt - シンプルな CRUD ベースのサポート サブドメイン
  2. Sales - これは私の CQRS ベースのコア ドメインです

フリート管理で CRUD 操作が発生した場合、操作を反映するイベントを発行する必要があります。

  • 航空機作成
  • 航空機アップデート
  • 航空機削除済み

これらのイベントは、a) Sales ドメインで必要なさまざまなインデックス テーブルを更新するために、および b) 統合された監査ログを提供するために必要です。

質問:単純な CRUD コンテキストでは必要のない をInProcessEventBus介さずに、これらのイベントを保存して公開する簡単な方法はありますか (ここでは NSB を使用していません)。AggregateRoot

4

2 に答える 2

0

Ncqrsの主な寄稿者であるPieterによると、これを箱から出して行う方法はありません。

このシナリオでは、コマンドを作成して実行し、イベントを発行するためだけにイベントストアから集約ルートをロードするというセレモニー全体を実行したくありません。

動作は単純なCRUDであり、可能な限り単純なソリューションを使用して実装されます。この特定のケースでは、EntityFrameworkを使用したフォームオーバーデータです。必要なのは、トランザクションが発生するとイベントが公開されることだけです。

私の解決策は次のようになります。

// Abstract base class that provides a Unit Of Work

public abstract class EventPublisherMappedByConvention 
    : AggregateRootMappedByConvention
{
    public void Raise(ISourcedEvent e)
    {
        var context = NcqrsEnvironment.Get<IUnitOfWorkFactory>()
            .CreateUnitOfWork(e.EventIdentifier);
        ApplyEvent(e);
        context.Accept();
    }
}

// Concrete implementation for my specific domain
// Note: The events only reflect the CRUD that's happened.
// The methods themselves can stay empty, state has been persisted through
// other means anyway.

public class FleetManagementEventSource : EventPublisherMappedByConvention
{
    protected void OnAircraftTypeCreated(AircraftTypeCreated e) { }
    protected void OnAircraftTypeUpdated(AircraftTypeUpdated e) { }
    // ...
}

// This can be called from anywhere in my application, once the 
// EF-based transaction has succeeded:

new FleetManagementEventSource().Raise(new AircraftTypeUpdated { ... });
于 2011-10-19T15:22:55.710 に答える
0

何かに関するイベントを公開したい場合、これはおそらく集約ルートです。これは、関心のあるバンドルに関する外部的に識別されたオブジェクトであるためです。そうでなければ、なぜそれらを追跡したいのでしょうか?

そのことを念頭に置いて、セールス BC にインデックス テーブルは必要ありません (これらはクエリ用であることは理解しています)。航空機の GUID と、読み取り側での参照/結合のみが必要です。

監査の場合、リポジトリ/作業単位でのリフレクションを介して一般的な監査イベントを追加するだけです。

于 2011-10-20T00:08:09.020 に答える