依赖注入,ASP.NET MVC,Ninject:将某些实现绑定到某些控制器

时间:2015-07-26 18:33:48

标签: c# asp.net-mvc dependency-injection ninject

假设我有两个控制器在它们的构造函数中使用相同的接口,如:

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分开?

1 个答案:

答案 0 :(得分:2)

您可以像这样使用条件/ contextual bindings

Bind<IOperation>().To<Implementation1>()
    .WhenInjectedInto<Controller1>();

Bind<IOperation>().To<Implementation2>()
    .WhenInjectedInto<Controller2>();

注意,然后WhenInjectedInto约束检查直接注入的类型。还有一些其他的内置约束,当然你也可以使用When(...)方法编写自己的约束。