Binding 向上搜索以查找类型的Ninject绑定约束

Binding 向上搜索以查找类型的Ninject绑定约束,binding,ninject,contextual-binding,Binding,Ninject,Contextual Binding,我有这样一个类层次结构(简化): 类连接 { } 接口设备 { } 类服务实现:IService { 公共服务实现(连接) { } } 接口I连接配置 { 公共无效配置(连接c) } 类连接配置:IConnectionConfiguration { 公共无效配置(连接c) } 其中我有多个IConnectionConfiguration和IService的实现。我想创建一个提供程序/绑定,它: 构造一个新的连接实例 GetAll并将其应用于连接 绑定基于以下内容指定要使用的IConnectio

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

类连接
{
}
接口设备
{
}
类服务实现:IService
{
公共服务实现(连接)
{
}
}
接口I连接配置
{
公共无效配置(连接c)
}
类连接配置:IConnectionConfiguration
{
公共无效配置(连接c)
}
其中我有多个IConnectionConfiguration和IService的实现。我想创建一个提供程序/绑定,它:

  • 构造一个新的连接实例
  • GetAll并将其应用于连接
  • 绑定基于以下内容指定要使用的IConnectionConfiguration实现: 关于要构造的IService类型
  • 目前,我有这样一个提供程序实现:

    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;
    }
    
    公共连接CreateInstance(IContext上下文)
    {
    var configurations=context.Kernel.GetAll()
    var connection=新连接();
    foreach(配置中的变量配置)
    {
    配置(连接);
    }
    回路连接;
    }
    
    但是当我尝试为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.
    });
    
    Bind().To().When(ctx=>{
    //循环父上下文,查看服务==typeof(iSeries设备);
    //除外:ParentRequest和ParentContext属性为空。
    });
    

    我做错了什么?我可以用ninject执行此操作吗?

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

    另见

    context.GetContextPreservingResolutionRoot().GetAll();
    
    谢谢,我不想在项目中添加扩展,有没有办法“手动”创建保留上下文的子请求?为什么不添加扩展?他们是Ninject项目的一部分。当然,有一种方法可以手动完成。严格执行扩展中所做的操作。但是,这样您就必须自己维护代码。
    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.
    });
    
    context.GetContextPreservingResolutionRoot().GetAll<IConnectionConfiguration>();