ASP.NET MVC. Следует ли использовать шаблон репозитория для записи моделей представления в базу данных или сначала преобразовать их в модели? - PullRequest
9 голосов
/ 16 марта 2010

В моем приложении ASP.NET MVC у меня есть довольно сложная страница редактирования, которая объединяет несколько моделей в одном представлении.

Я использую шаблон ViewModel для объединения всей этой информации и представления одного связного объекта в View.

Например, моя структура ViewModel выглядит примерно так:

CompanyId
CompanyName
List<Employee> Employees
List<ContactMethod> ContactMethods

Объект Employee имеет ряд базовых свойств и предпочтительный метод связи.

На странице редактирования пользователю предоставляются все сотрудники компании, и они имеют возможность добавлять и удалять (используя javascript), а также редактировать сведения о сотрудниках. Список ContactMethods используется для заполнения раскрывающегося списка для каждого сотрудника.

Я успешно перевел свои Модели (считанные из базы данных) в эту ViewModel и обратно, поэтому после редактирования у меня остается ViewModel, представляющая текущее состояние сотрудников этой компании.

Я использую шаблон Repository для связи с базой данных, поэтому мой вопрос: мне следует позвонить напрямую в CompanyRepository, передав ViewModel, или мне сначала нужно преобразовать ViewModel обратно в объекты Model перед использованием Репозиторий для записи их в базу данных?

Короче говоря, должен ли репозиторий знать о моих объектах ViewModel?

Ответы [ 3 ]

13 голосов
/ 16 марта 2010

Сначала я бы преобразовал ViewModel в объекты Model. Мне нравится сохранять зависимость между моим веб-слоем и слоями репозитория настолько свободной, насколько это возможно.

Я не думаю, что ваш репозиторий должен знать о вашей ViewModel, поскольку это концепция веб-уровня.

4 голосов
/ 16 марта 2010

ViewModel - модель для представления (UI), поэтому хранилище не должно знать о модели представления. Разделение их будет держать репозиторий слабо связанным с пользовательским интерфейсом.

Используйте другой уровень, такой как сервисный уровень, для инкапсуляции хранилища из пользовательского интерфейса. Этот слой также выполняет диалог ViewModel - Model и выполняет вызов репозитория.

public class ServiceLayer
{
   public void SaveModel(ViewModel viewmodel)
   {
      var model = viewModel.ToModel();
      repository.Save(model)
   }
}
1 голос
/ 16 марта 2010

Я бы согласился с предыдущим ответом о преобразовании ViewModels обратно в "простые" модели, но добавил бы, что эта задача, вероятно, должна выполняться отдельным сервисным уровнем. Этот слой будет отвечать за разборку ваших ViewModels и за правильное поведение.

По сути, это определение службы: то, чья работа заключается в выполнении логической единицы работы, которая требует нескольких моделей и / или сложной логики.

...