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 并将其应用于连接。
  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 回答