0

ドメイン イベントは、イベント クラス、またはクラスとトピックに従ってディスパッチする必要がありますか?

たとえば、次のイベントがあります。

class UserRegisteredEvent implements INonTransactionalEvent{
    public Timestamp: TTimestamp;
}

そしてイベントマネージャー、

class EventManager {
   /** Omitted **/
}

Udi Dahanは、イベントはファースト クラス オブジェクトであると提案していますが、私はそれが気に入っています。UserRegisteredEventオブジェクト、 OrderCompleteオブジェクトがあります。私の質問は、型自体がイベント ハンドラーにバインドされるかどうかです。たとえば、イベント オブジェクトを publish メソッドに渡すだけでよいでしょうか?

EventManager.Publish(new UserRegisteredEvent(1));

これは、各ハンドラーが 1 つのクラス タイプにバインドされていることを意味し、制限があるようです。YAGNI は正しいかもしれませんが、以下はより強力ではありません。

EventManager.Publish(new UserRegisteredEvent(1), Events.UserRegistered)

これにより、イベントトピックがハンドラーのバインド先になります。このようにして、ハンドラーは継承の恩恵を受けることができます。型の安全性またはユビキタス言語の使用が問題である場合、次のことができます。

EventManager.UserRegisteredEvent(1)

これは、より長い公開バージョンへの簡単な方法です。これは、新しいイベントごとにクラスを変更する必要があることを意味するため、少し面倒です。これは不要に思えます (実際、上記の方法を使用する場合は必要ありません)。

イベントがトピックのないクラスとして公開されるのを見たことがありますが、これは制限ですか、それともこれで問題が発生した人はいますか?

4

2 に答える 2

1

ドメイン イベントは、実際には特定の実装を必要としません。結局のところ、それらはセマンティック DTO にすぎません。何を達成しようとしているのかわかりませんが、サービス バスを構築していない限り、構成されているハンドラーによって処理されるようにイベント オブジェクトを送信するだけです。

イベントはハンドラーを認識せず、ハンドラーはお互いを認識せず、バスはイベントをハンドラーに送信する方法を認識します。そして、ハンドラーが 1 つのイベント SRP のみを明示的に処理するようにします。関連するハンドラーの実装を 1 つのクラスに結合できますが、それは実装の詳細です。

于 2014-06-23T14:31:23.537 に答える
0

トピックを導入したい場合は、インターフェイスの継承を通じて行います。例えば:

interface IUserEvent : INonTransactionalEvent { ... }

class UserRegisteredEvent implements IUserEvent {
    public Timestamp: TTimestamp;
}

Publishコードと言語への影響はごくわずかです。一般的なメソッドを受け入れて使用し続けることができINonTransactionalEvent、トピックを簡単にリファクタリングすることもできます。

于 2014-06-23T10:54:39.253 に答える