В моем приложении MVC ASP.NET у меня есть довольно сложная страница редактирования, которая комбинирует много моделей в одно представление.
Я использую шаблон ViewModel, чтобы объединить всю эту информацию и представить один связный объект Представлению.
Как пример, моя структура ViewModel - что-то вроде этого:
CompanyId
CompanyName
List<Employee> Employees
List<ContactMethod> ContactMethods
Объект Сотрудника имеет много основных свойств и предпочтительный метод контакта.
На странице редактирования пользователю дают всех сотрудников компании, и у них есть способность добавить и удалить (использование JavaScript), а также отредактировать детали сотрудника. Список ContactMethods используется для заполнения выпадающего для каждого сотрудника.
Я успешно перевел свои Модели (чтение от базы данных) в этот ViewModel и назад снова, поэтому после редактирования, меня оставляют с ViewModel, представляющим текущее состояние сотрудников той компании.
Я использую шаблон Репозитория для общения с базой данных, таким образом, мой вопрос, я должен звонить непосредственно в CompanyRepository, передавая ViewModel, или я должен преобразовать ViewModel назад в Объекты модели сначала перед использованием Репозитория, чтобы записать им в базу данных?
Короче говоря, Репозиторий должен знать о моих объектах ViewModel?
Сначала я бы преобразовал ViewModel обратно в объекты Model. Мне нравится сохранять как можно более свободную зависимость между моим веб-слоем и слоями репозитория.
Я не думаю, что ваш репозиторий должен знать о вашей ViewModel, поскольку это концепция веб-уровня.
ViewModel - это модель для представления (UI), поэтому хранилище не должно знать о модели представления. Их разделение позволит сохранить свободную связь хранилища с пользовательским интерфейсом.
Для инкапсуляции хранилища от пользовательского интерфейса используйте другой слой, например слой сервисов. Этот слой также выполняет взаимодействие ViewModel - Model и выполняет вызов репозитория.
public class ServiceLayer
{
public void SaveModel(ViewModel viewmodel)
{
var model = viewModel.ToModel();
repository.Save(model)
}
}
Я согласен с предыдущим ответом о преобразовании ViewModels обратно в "обычные" Models, но я бы добавил, что эта задача, вероятно, должна выполняться отдельным сервисным уровнем. Этот уровень будет отвечать за разборку ваших ViewModels и действовать соответствующим образом.
Это, по сути, определение сервиса: нечто, чья работа заключается в выполнении логической единицы работы, требующей множества моделей и/или сложной логики.