Ninject Binding Constraint搜索最多查找类型

时间:2011-09-26 07:04:48

标签: binding ninject contextual-binding

我有一个像这样的类层次结构(简化):

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. Bindings指定要使用的IConnectionConfiguration实现,基于 关于要构建的IService的类型
  4. 目前我有这样的提供程序实现:

    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做到这一点吗?

1 个答案:

答案 0 :(得分:2)

通过调用kernel.GetAll,您正在创建新请求。它没有关于服务上下文的信息。有一个扩展,允许您创建保留原始上下文的新请求(Ninject.Extensions.ContextPreservation)

另见https://github.com/ninject/ninject.extensions.contextpreservation/wiki

context.GetContextPreservingResolutionRoot().GetAll<IConnectionConfiguration>();