我是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>();
}
}
答案 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");