0

Я изучаю IoC в первый раз, но не могу понять, как это работает с viewmodels и привязкой модели в стандартном ASP.NET MVC-контроллере. Предположим, у меня есть базовый контроллер, использующий тесно связанный репозиторий и viewmodel.DI с viewmodel в ASP.NET MVC

public class Sample 
{ 
    [HttpGet] 
    public ActionResult Index() 
    { 
     var repo = new SampleRepository(); 
     var model = new SampleViewModel(); 
     model.SampleItems = repo.Get(); 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(SampleViewModel model) 
    { 
     ... 
    } 
} 

Теперь я хочу использовать DI для затягивая пара этого контроллера от его зависимых классов, так что я впрыснуть хранилище и ViewModel в инъекцией конструктора

public class Sample 
{ 
    private readonly ISampleRepository _sampleRepository; 
    private readonly ISampleViewModel _sampleViewModel; 

    public Sample(
      ISampleRepository sampleRepository, 
      ISampleViewModel sampleViewModel) 
    { 
     _sampleRepository = sampleRepository; 
     _sampleViewModel = sampleViewModel; 
    } 

    [HttpGet] 
    public ActionResult Index() 
    { 
     _sampleViewModel.SampleItems = _sampleRepository.Get() 

     return View(_sampleViewModel); 
    } 

    [HttpPost] 
    public ActionResult Index(SampleViewModel model) 
    { 
     ... 
    } 
} 

Моя проблема в том, что я в настоящее время инжекции viewmodel через интерфейс, но для действия HttpPost требуется конкретный SampleViewModel для привязки модели?

Я не понял, как это работает? Должен ли я пытаться свободно связывать свою модель обзора с контроллером или это просто то, что требует жесткой связи для работы с переплетным устройством? Я видел код там, где люди используют сервисный уровень для возврата viewmodel к контроллеру, и я знаю, что вы также можете написать настраиваемое связующее устройство, но это похоже на массовый перебор для того, что я хочу здесь сделать? Все, что мне нужно - это способ ввода в базовую модель просмотра, которая затем может использоваться представлением для GET и POST.

+0

Обращаем внимание, что тег-контроллер-модель предназначен для вопросов о шаблоне. Существует определенный тег для реализации ASP.NET-MVC. –

+1

Почему вы вводите модель представления (вы вводите услуги, а не модели)? –

+0

Извинения за пометку - первый пост, так что я изучаю :( – JoshRees

ответ

3

A viewmodel фактически нет do все. Это в основном просто DTO, который передает данные с вашего контроллера на ваш просмотр. По определению, он не может иметь никаких зависимостей. Вместо этого он является частью состояния приложения .

Injecting runtime data is anti-pattern. Вместо этого ваш контроллер должен создать экземпляр вашей модели просмотра, поскольку он всегда должен возвращать его. Нет никаких оснований издеваться над ним для тестирования, и нет никаких причин для его замены. Таким образом, нет оснований делать абстракцию (интерфейс или абстрактный класс).

public class Sample 
{ 
    private readonly ISampleRepository _sampleRepository; 

    public Sample(
      ISampleRepository sampleRepository) 
    { 
     _sampleRepository = sampleRepository; 
    } 

    [HttpGet] 
    public ActionResult Index() 
    { 
     var sampleViewModel = new SampleViewModel() 
     { 
      SampleItems = _sampleRepository.Get(), 
      // Other initialization here... 
     }; 

     return View(sampleViewModel); 
    } 

    [HttpPost] 
    public ActionResult Index(SampleViewModel model) 
    { 
     ... 
    } 
} 
+0

А, ок. Моя модель просмотра - это только контейнер данных. Он состоит только из полей и коллекций и заполняется контроллером. Поскольку я новичок ioc, то, что меня обманывало, я считаю, что контроллер имеет зависимость от viewmodel. Я предположил, что реализация DI означает, что я никогда не буду вручную снова создавать новый класс. Я верю, что вы говорите мне, что, поскольку viewmodel является только DTO и поэтому не нуждается в тестировании/издевательстве, и потому, что viewmodel тесно связан с представлением в любом случае (через привязку модели), что я в порядке на новую конкретную видовую модель моего контроллера? – JoshRees

+0

@ JoshRees Да, это правильно. Использование DI не означает, что вы никогда не будете использовать новое ключевое слово для повторного создания объектов.Используйте только DI, где это имеет смысл, как и все. –

+0

Cheers Martin. Именно эту информацию я искал. – JoshRees

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