MVC Best Practice: Где сделать сопоставление между моделями - PullRequest
2 голосов
/ 27 февраля 2012

У меня есть проект MVC, который примерно организован следующим образом:

  1. Проект 1: приложение MVC (ViewModels, Controller, Actions, UI-stuff)
  2. Проект 2: Модель домена (Классы доменов, поведение, доступ к данным (слой Persitance, репозитории)

Мой вопрос заключается в том, где выполнять сопоставление и доступ к данным (как организовать код).

По определение (насколько я понимаю) контроллер должен отобразить запрос в правильном представлении и быть максимально тонким.

Я использую Automapper для базового отображения, и я делаю это в контроллере, ноДля более сложного сопоставления мне проще сделать сопоставление самостоятельно.

У меня есть в основном два места для кода:

  1. В контроллере:

Это может легко запутаться, особенно если мне нужно получить информацию из нескольких репозиториев, создать списки выбора и т. Д.

  1. В ViewModel:

Это чувствует себя лучше, но я не люблюСоздание репозиториев и UnitOfWork в модели.Не знаю, принадлежат ли они там.

Сейчас я делаю что-то среднее:

Я позволяю ViewModel взять необходимые репозитории в качестве параметров конструктора, и я делаюкартирование там.Я создаю экземпляр Repositories / UnitOfWork в контроллере и передаю его. Хорошо, что я могу использовать интерфейс для репозиториев, поэтому ViewModel не нужно заботиться о реализации.

Однако в примерах в Интернете я всегда вижу весь этот код в контроллере, поэтому я задаюсь вопросом - как правильно сделать это?

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Чтобы сделать это в ViewModel, это означает, что ваша viewmodel должна понимать ваш другой объект.Это не хорошо.ViewModel должна быть настолько глупой, насколько это возможно, о внешних зависимостях.

Вы должны выполнять отображение в контроллере.

1 голос
/ 27 февраля 2012

Вы можете использовать атрибут ActionFilter для выполнения процесса отображения. Пожалуйста, обратитесь к блогу Джимми Боггарда на Как сделать MVC - View Model . Я лично чувствую, что это чистый подход и избавиться от кода отображения из контроллера.

...