私は自分のシステムにドメインイベントを実装しようとしていますが、止まっています。私はSimpleInjectorを使用しています。私は何かが欠けていると思います。ドメインイベントを使用した単純なインジェクタ
ドメインイベント:
public static class DomainEvent
{
public static IEventDispatcher Dispatcher { get; set; }
public static void Raise<T>(T @event) where T : IDomainEvent
{
Dispatcher.Dispatch(@event);
}
}
SimpleInjectorEventDispatcher
public class SimpleInjectorEventDispatcher : IEventDispatcher
{
private readonly Container container;
public SimpleInjectorEventDispatcher(Container container)
{
this.container = container;
}
public void Dispatch<TEvent>(TEvent eventToDispatch) where TEvent : IDomainEvent
{
var handlerType = typeof(IDomainHandler<>).MakeGenericType(eventToDispatch.GetType());
var handlers = this.container.GetAllInstances(handlerType);
foreach (dynamic handler in handlers)
{
handler.HandleEvent((dynamic)eventToDispatch);
}
}
}
SimpleInjector
container.Register<IEventDispatcher, SimpleInjectorEventDispatcher>();
IEventDispatcherのDispatcherは常にnullです。正しく初期化されていることを確認する方法を教えてください。
詳細な回答ありがとうございます。私はあなたのアドバイスを取って静的なクラスを捨てます。つまり、すべてのエンティティでIEventDispatcherを受け入れるコンストラクタが必要なのでしょうか? – Wekslie
エンティティいいえ、エンティティはConstructor Injectionを使用して依存関係を取得すべきではありません。 DDDを適用する場合は、メソッド注入を使用する必要があります。つまり、依存関係を実際に使用するエンティティメソッドは、メソッドを使用する必要があります。 – Steven
もう一度ありがとう!もう一つの関連する質問:SimpleInjectorEventDispatcherにはContainerフィールドがあります。 SimpleInjectorConfigurationからコンテナを使用するようにフィールドを設定するにはどうすればよいですか? – Wekslie