ASP.NET MVC - Я должен использовать Шаблон Репозитория, чтобы записать ViewModels в базу данных или преобразовать их в Модели сначала?

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

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

Как пример, моя структура ViewModel - что-то вроде этого:

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

Объект Сотрудника имеет много основных свойств и предпочтительный метод контакта.

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

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

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

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

9
задан Damovisa 16 March 2010 в 04:39
поделиться

3 ответа

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

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

13
ответ дан 4 December 2019 в 11:41
поделиться

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

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

public class ServiceLayer
{
   public void SaveModel(ViewModel viewmodel)
   {
      var model = viewModel.ToModel();
      repository.Save(model)
   }
}
4
ответ дан 4 December 2019 в 11:41
поделиться

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

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

1
ответ дан 4 December 2019 в 11:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: