5

私はMVCプロジェクトでNinjectを使用しており、UdiDahanのパターンhttp://www.udidahan.com/2009/06/14/domain-events-salvation/に従ってドメインイベントを実装しようとしています。

以下の抜粋では、「コンテナ」は、発生した特定のタイプのイベントのすべてのイベントハンドラーを解決するために使用されます。

私の質問(そして基本的なものが欠けている場合はお詫びします)は、Ninjectでこれを行う方法ですか?言い換えると:

  1. 「コンテナ」はこの静的クラスでどのように設定されますか?

  2. コンテナ(カーネル?)を取得したら、すべてのイベントハンドラーを解決するためのNinject構文はどうなりますか(サービスモジュールに事前に登録する必要があると想定しています)?

コンストラクターインジェクションのみを使用する必要があり、そこからすべてが再帰的に解決され、Ninjectカーネルへのアクセスはノーノーであるという投稿を読み続けています。したがって、これを行う方法についてのアドバイスは大歓迎です。

記事からの抜粋

public static class DomainEvents
{ 
  [ThreadStatic] //so that each thread has its own callbacks
  private static List<Delegate> actions; 

  public static IContainer Container { get; set; } //as before

  //Registers a callback for the given domain event
  public static void Register<T>(Action<T> callback) where T : IDomainEvent
  {
     if (actions == null)
        actions = new List<Delegate>();

     actions.Add(callback);
 }

 //Clears callbacks passed to Register on the current thread
 public static void ClearCallbacks ()
 {
     actions = null;
 }

 //Raises the given domain event
 public static void Raise<T>(T args) where T : IDomainEvent
 {
    if (Container != null)
       foreach(var handler in Container.ResolveAll<Handles<T>>())
          handler.Handle(args);

    if (actions != null)
        foreach (var action in actions)
            if (action is Action<T>)
                ((Action<T>)action)(args);
 }
}
4

1 に答える 1

6

「コンテナ」はこの静的クラスでどのように設定されますか?

アプリケーションの起動時に設定する必要があります。

DomainEvents.Container = kernel;

すべてのイベントハンドラーを解決するためのNinject構文は何でしょうか。

たとえば、次のように実行できます。

Container.Get<IEnumerable<Handles<T>>>())

Udiの静的DomainEventsクラスは、Ambient Contextアンチパターンの実装です(DI PP&Pの5.3章を参照)。IDomainEventsこの場合、コードを静的インスタンスに依存させるのではなく、依存性注入を使用して、それを必要とするコードに抽象化を注入します。

ただし、問題は、ドメインオブジェクトが依存関係を必要としIDomainEvents、コンストラクターの挿入が(おそらく)不可能であるということです。その場合の秘訣は、メソッドインジェクションを使用することです。

つまり、コンストラクターインジェクションを使用して、IDomainEventsコマンドハンドラーまたはサービス(またはドメインオブジェクトのメソッドを使用するビジネスロジックを呼び出すもの)にインジェクションし、依存関係を必要とするメソッド(メソッド注入)。

于 2012-10-23T08:23:21.027 に答える