Ninject - 将不同的接口实现绑定到同一个类

时间:2017-01-25 05:53:44

标签: c# dependency-injection ninject

我是DI的新手(使用Ninject),刚刚开始学习这些概念,但我已经摸不着头脑了解了一下:

假设我在我的程序中使用了相同的类(在下面的示例中为ProcessContext)。

在第一堂课(SomeClass)中:我想将Implement1注入ProcessContext个实例。

在第二课(SomeOtherClass)中:我想将Implement2注入ProcessContext个实例。

我应该如何使用Ninject执行绑定?

public class Implement1 : IAmInterace
{
   public void Method()
   {
   }
}

public class Implement2 : IAmInterace
{
   public void Method()
   {
   }
}

public class ProcessContext : IProcessContext
{
   IAmInterface iamInterface;
   public ProcessContext(IAmInterface iamInterface)
   {
      this.iamInterface = iamInterface;
   } 
}

public class SomeClass : ISomeClass
{
    public void SomeMethod()
    {
        // HERE I WANT TO USE: processcontext instance with Implement1
        IProcessContext pc = kernel.Get<IProcessContext>();            
    }
}

public class SomeOtherClass : ISomeOtherClass
{
    public void SomeMethod()
    {
        // HERE I WANT TO USE: processcontext instance with Implement2
        IProcessContext pc = kernel.Get<IProcessContext>();            
    }
}

3 个答案:

答案 0 :(得分:0)

您可以通过以下方式轻松注入其他构造函数参数:

public void SomeMethod()
{
    var foo = new Ninject.Parameters.ConstructorArgument("iamInterface", new Implement2());
    IProcessContext pc = kernel.Get<IProcessContext>(foo);            
}

目前,我无法访问ninject。所以告诉我它是否按预期工作。

答案 1 :(得分:0)

这是不可能的,因为Ninject无法知道返回哪个实现。然而;如果通过传入一个变量来创建IProcessContext的新实例,那么Ninject将使用适当的构造函数查找实现并返回该实例。

答案 2 :(得分:0)

您可以使用named bindings

e.g。类似的东西:

Bind<IProcessContext>()
    .To<ProcessContext>()
    .WithConstructorArgument("iamInterface", context => Kernel.Get<Implement1>())
    .Named("Imp1");

Bind<IProcessContext>()
    .To<ProcessContext>()
    .WithConstructorArgument("iamInterface", context => Kernel.Get<Implement2>())
    .Named("Imp2");

kernel.Get<IProcessContext>("Imp1");