假设我有两个控制器在它们的构造函数中使用相同的接口,如:
public class XController: Controller{
private IOperation operation;
public XController (IOperation operation){
this.operation = operation;
}
public ActionResult Index(){
ViewBag.Test = operation.Test();
return View();
}
}
public class YController: Controller{
private IOperation operation;
public YController (IOperation operation){
this.operation = operation;
}
public ActionResult Index(){
ViewBag.Test = operation.Test();
return View();
}
}
并且
public interface IOperation {
String Test();
}
public class Implementation1: IOperation{
String Test(){retrun "Implementation 1";}
}
public class Implementation2: IOperation{
String Test(){retrun "Implementation 2";}
}
使用Ninject时,我可以执行kernel.Bind<IOperation>().To<Implementation1>()
,这会改变我的X和Y控制器的行为。但是,我有时可能需要将我的X控制器绑定到Implementtaion1,同时让我的Y控制器仍然绑定到Implementation 2。
这是否可行,而无需通过定义新接口完全将实现1与实现2分开?
答案 0 :(得分:2)
您可以像这样使用条件/ contextual bindings:
Bind<IOperation>().To<Implementation1>()
.WhenInjectedInto<Controller1>();
Bind<IOperation>().To<Implementation2>()
.WhenInjectedInto<Controller2>();
注意,然后WhenInjectedInto
约束检查直接注入的类型。还有一些其他的内置约束,当然你也可以使用When(...)
方法编写自己的约束。