Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 依赖注入、ASP.NET MVC、Ninject:将某些实现绑定到某些控制器_C#_Asp.net Mvc_Dependency Injection_Ninject - Fatal编程技术网

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

C# 依赖注入、ASP.NET MVC、Ninject:将某些实现绑定到某些控制器,c#,asp.net-mvc,dependency-injection,ninject,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

假设有两个控制器在其构造函数中使用相同的接口,如下所示:

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();
   } 
}

使用Ninject时,我可以执行
kernel.Bind().To()
,这会改变我的X和Y控制器的行为。然而,有时我可能需要将我的X控制器绑定到实现1,而让我的Y控制器仍然绑定到实现2。 不必通过定义一个新接口将实现1与实现2完全分离,这是可能的吗?

您可以使用conditional/like so:

Bind().To())
.当输入到()时;
将()绑定到()上
.当输入到()时;

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

交换实现时控制器会发生什么情况?这些控制器是否取决于实际实现?如果是这样,你就违反了法律。如果是这种情况,您应该为每个实现提供自己独特的接口。
public interface IOperation {
    String Test();
}
public class Implementation1: IOperation{
    String Test(){retrun "Implementation 1";}
}
public class Implementation2: IOperation{
    String Test(){retrun "Implementation 2";}
}
Bind<IOperation>().To<Implementation1>()
    .WhenInjectedInto<Controller1>();

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