2015-07-26 1 views
0

Если предположить, что у меня есть два контроллера, которые используют один и тот же интерфейс в своих конструкторах, как:Dependency Injection, ASP.NET MVC, 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 я могу сделать , и это изменяет поведение для моих X и Y контроллеров. Тем не менее, мне иногда может потребоваться привязать мой X-контроллер к Implementtaion1, оставив мой контроллер Y еще привязанным к реализации 2. Возможно ли это вообще без необходимости полностью отделять реализацию 1 от реализации 2, определяя новый интерфейс?

+0

Что происходит с контроллерами при смене реализаций? Являются ли эти контроллеры зависимыми от фактической реализации? Если это так, вы нарушаете [Принцип замены Лискова] (https://en.wikipedia.org/wiki/Liskov_substitution_principle). Если это так, каждая реализация должна иметь свой собственный уникальный интерфейс. – Steven

ответ

2

Вы можете использовать условные/contextual bindings так:

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

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

Обратите внимание, что после этого WhenInjectedInto проверки ограничений для данного типа это непосредственно вводит. Существуют и другие встроенные ограничения, и, конечно, вы также можете написать свой собственный, используя метод When(...).

 Смежные вопросы

  • Нет связанных вопросов^_^