NCQRS:総合的なルートを持たずにイベントを上げる方法
-
27-10-2019 - |
質問
私には2つあります 境界のあるコンテキスト:
- フリートMGT-シンプルなCRUDベースのサポートサブドメイン
- 販売 - これは私のCQRSベースです コアドメイン
艦隊管理でCRUD操作が発生した場合、操作を反映するイベントを公開する必要があります。
- 航空機が作成
- 航空機で採用されています
- 航空機販売
- 等
これらのイベントはa)販売ドメインで必要なさまざまなインデックステーブルを更新するには、b)統一された監査ログを提供するために必要です。
質問: これらのイベントを保存して公開する簡単な方法はありますか(に InProcessEventBus
, 、ここではNSBを使用していません) AggregateRoot
, 、それを単純なCRUDコンテキストでは必要ありません。
解決 2
NCQRSの主な貢献者であるPieterによると、これを箱から出して行う方法はありません。
このシナリオでは、コマンドを作成して実行するという式典全体を通過し、イベントストアから集計ルートをロードして、イベントを発してもらいたくありません。
動作は単純なCRUDであり、可能な限り単純なソリューションを使用して実装されており、この特定のケースでは、エンティティフレームワークを使用してフォームオーバーデータです。私が必要とする唯一のことは、トランザクションが発生した後に公開されるイベントです。
私の解決策は次のようになります:
// 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 { ... });
他のヒント
何かについてのイベントを公開したい場合、これはおそらく集計ルートです。なぜなら、それは関心のある束に関する外部から識別されたオブジェクトであるため、なぜあなたはそれらを追跡したいのですか?
それを念頭に置いて、販売BCでインデックステーブル(これらがクエリ用であると理解していると理解しています)は必要ありません。航空機のガイドが必要であり、読み取り側でのみルックアップ/結合のみが必要です。
監査のために、リポジトリ/ユニットの仕事を介して一般的な監査イベントを追加するだけです。