2

Я впрыскиваю зависимость в методе действия контроллера ASP.NET MVC.Условная инъекция инъекции инъекций

Сценарий: Я хочу использовать интерфейс в действии метода ASP.NET MVC-контроллера. Этот интерфейс реализован двумя классами. Например, модель A и модель B реализуют interfaceA. Во время выполнения, когда пользователь меняет значение в раскрывающемся списке в соответствии со значением выпадающего зависимостей, инъекция должна определять, следует ли ему вводить modelA или modelB.

Также я не уверен, что это единственное решение, или существуют другие решения? Или заводчик не уверен.

+0

Это не подходит для инъекций зависимостей. Нет простого способа связать результат сбрасывания с контейнером DI. Лучше просто вводить обе и выбирать класс в соответствии с параметром маршрута или URL. –

+0

Спасибо, я думаю, это сработает. Я попробую . Можем ли мы поместить общий логин где-нибудь, а не писать во многих методах действий? Также я забыл упомянуть ModelA и ModelB в разных сборках. Предположим, что при выпадающем значении 1 мне нужно сделать экземпляр modelA else ModelB Как Public ActionResule MehtodName (InterfaceA inter) { // Должен ли я идти с указанием значений маршрута ?? } –

+0

Вы можете зарегистрировать их в своем контейнере DI и ввести их в свой класс контроллера, например. 'class MyController (ModelA a, ModelB b)', а затем сохраните их в 'private readonly', каждый из них сможет их использовать. Или, если у них есть общий интерфейс, вы можете ввести «IEnumerable », а затем выбрать, какой из них использовать на основе некоторых метаданных самой модели. –

ответ

0

Вы можете использовать шаблон фабрики:

public interface InterfaceAFactory 
{ 
    InterfaceA Create(int dropDownValue); 
} 

public class AFactory : InterfaceAFactory 
{ 
    private readonly IContainer _container; 
    public AFactory(IContainer container) 
    { 
     _container = container; 
    } 

    public InterfaceA Create(int dropDownValue) 
    { 
     if(dropDownValue > 0) 
      return _container.GetInstance<ModelA>(); 

     _container.GetInstance<ModelB>(); 
    } 
} 

(или просто вводят необходимые зависимости вместо контейнера) , а затем просто

private readonly InterfaceAFactory _interfaceAFactory; 

public MvcController(InterfaceAFactory interfaceAFactory) 
{ 
    _interfaceAFactory = interfaceAFactory; 
} 

public void DropDownValueChanged(int dropDownValue) 
{ 
    var model = _interfaceAFactory.Create(dropDownValue); 
} 

Я использовал StructureMap, кроме вас может адаптировать это к AutoFac (регистрируя экземпляры, вводя контейнер и разрешая экземпляр).

+0

Не могли бы вы привести пример с помощью ActionMethod в контроллере. Я устанавливаю зависимость от модели ввода не в конструкторе. как Public ActionResult ActionName (IMyModelInterface obj) –

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