3

私はこのようなクラス階層を持っています(簡略化):

class Connection
{
}

interface IService<T>
{
}


class ServiceImplementation : IService<int>
{
   public ServiceImplementation(Connection)
   {
   }
}

interface IConnectionConfiguration
{
   public void Configure(Connection c)
}

class ConnectionConfiguration : IConnectionConfiguration
{
   public void Configure(Connection c)
}

IConnectionConfiguration と IService の複数の実装があります。次のプロバイダー/バインディングを作成したいと考えています。

  1. Connection の新しいインスタンスを構築します。
  2. GetAll を取得し、それを Connection に適用します。
  3. バインディングは、構築される IService のタイプに基づいて、使用される IConnectionConfiguration 実装を指定します。

現在、次のようなプロバイダーの実装があります。

public Connection CreateInstance(IContext context)
{
     var configurations = context.Kernel.GetAll<IConnectionConfiguration>()
     var connection = new Connection();
     foreach(var config in configurations)
     {
        config.Configure(connection);
     }

     return connection;
}

しかし、 IConnectionConfiguration のコンテキストバインディングを作成しようとすると、親リクエストまたは親コンテキストがありません...

Bind<IConnectionConfiguration>().To<ConcreteConfiguration>().When(ctx => {
 // loop through parent contexts and see if the Service == typeof(IService<int>);
 // EXCEPT: The ParentRequest and ParentContext properties are null.
});

ここで何が間違っていますか?ninjectでこれを行うことはできますか?

4

1 に答える 1

2

電話をかけるkernel.GetAllことで、新しいリクエストを作成しています。サービスコンテキストに関する情報はありません。元のコンテキストを保持する新しいリクエストを作成できる拡張機能があります(Ninject.Extensions.ContextPreservation)

https://github.com/ninject/ninject.extensions.contextpreservation/wikiも参照してください

context.GetContextPreservingResolutionRoot().GetAll<IConnectionConfiguration>();
于 2011-10-02T21:25:26.100 に答える