0

NServiceBusでJOlivers CommonDomain と EventStore を使用してテストを行っています。Aggregate で次のようにイベントを発生させる必要があります。

RaiseEvent(bus.CreateInstance<IPhoneNumberChanged>(m => { m.Number = number; }));

そして後で私はこのハンドラーを持っています:

private void Apply(IPhoneNumberChanged phoneNumberChangedEvent)
{
    this.Number = phoneNumberChangedEvent.Number;
}

残念ながら、これは機能しません。「CommonDomain.Core.HandlerForDomainEventNotFoundException: タイプ 'Phone' の集合体がタイプ 'IPhoneNumberChanged' のイベントを発生させましたが、メッセージを処理するハンドラーが見つかりませんでした。」.

ここでの問題は、「bus.CreateInstance」から作成されたオブジェクトです。これは、純粋な具体的なクラスで動作するためです。しかし、インターフェイスとしてイベントが必要です。これは解決できますか?

編集:注意してください-オブジェクトを作成するために「bus.CreateInstance」を使用する必要はありません。現在「IPhoneNumberChanged」を上げる必要がある最も簡単な(唯一の)方法です。ハンドラーに引数としてインターフェイスがある限り、他の方法も素晴らしいでしょう。

4

1 に答える 1

2

Phone 集約のコンストラクターで、以下を追加するだけです。

this.Register<IPhoneNumberChanged>(this.Apply);

それは例外を処理します。CommonDomain 内のデフォルトの内部ルーティング メカニズムは、リフレクションを使用せずに、イベントを適切な Handle メソッドに取得する方法を理解する登録ベースのルーターです。別のルーターが作成されており、すでにリフレクションを使用し、より規則に基づいた CommonDomain プロジェクトの一部になっています。

イベント名について簡単に考えてみましょう。電話番号が変更されたと言うのではなく、電話番号が変更された理由をイベントで示したい場合があります。ドメインの観点からは、何かの理由は常に、何よりも興味深く重要です。電話番号が変更されたという事実は、通常、興味深いものではありません。その人がアカウントを移動したりキャンセルしたりしたために変更されたという事実 - それは興味深いことであり、同様に重要である可能性が非常に高い.

于 2011-09-03T20:30:34.210 に答える