2017-02-22 15 views
1

私は自分のシステムにドメインイベントを実装しようとしていますが、止まっています。私は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です。正しく初期化されていることを確認する方法を教えてください。

答えて

1

IEventDispatcher Dispatcherは常にnullです。

シンプルインジェクタは、ランダムなクラスの静的メンバーを魔法のように初期化しません。起動時にこの静的フィールドを自分で設定していない限り、誰もいません。

しかし、この静的な使用を中止することを強くお勧めします。DomainEventクラス完全にです。このデザインはUdi Dahanのold articleに根ざしていますが、彼自身はずっと前にこの目的のために静的クラスを使用する考えを放棄しました。彼は現在、Iと同様にそれに対してアドバイスしています。

スタティッククラスは、テスト容易性と発見可能性の観点から面倒です。その観点から、Dependency Injectionの使用ははるかに良い選択肢です。

したがって、問題の解決は本当に簡単です。コードベースからstatic DomainEventsクラスを削除し、公開イベントが必要なコンシューマのコンストラクタにIEventDispatcherを挿入します。

+0

詳細な回答ありがとうございます。私はあなたのアドバイスを取って静的なクラスを捨てます。つまり、すべてのエンティティでIEventDispatcherを受け入れるコンストラクタが必要なのでしょうか? – Wekslie

+1

エンティティいいえ、エンティティはConstructor Injectionを使用して依存関係を取得すべきではありません。 DDDを適用する場合は、メソッド注入を使用する必要があります。つまり、依存関係を実際に使用するエンティティメソッドは、メソッドを使用する必要があります。 – Steven

+0

もう一度ありがとう!もう一つの関連する質問:SimpleInjectorEventDispatcherにはContainerフィールドがあります。 SimpleInjectorConfigurationからコンテナを使用するようにフィールドを設定するにはどうすればよいですか? – Wekslie

関連する問題