Для тех, кто создает ViewModels (для использования в типизированных представлениях) в ASP.NET MVC, предпочитаете ли вы получать данные из службы/репозитория из класса ViewModel или класса контроллера?
Например, мы начали с того, что ViewModels по существу были DTO и позволяли нашим контроллерам извлекать данные (грубо упрощенческий пример предполагает, что пользователь может изменять только имя сотрудника):
public class EmployeeViewModel
{
public String Name; //posted back
public int Num; //posted back
public IEnumerable<Dependent> Dependents; //static
public IEnumerable<Spouse> Spouses; //static
}
public class EmployeeController()
{
...
public ActionResult Employee(int empNum)
{
Models.EmployeeViewModel model = new Models.EmployeeViewModel();
model.Name = _empSvc.FetchEmployee(empNum).Name;
model.Num = empNum;
model.Dependents = _peopleSvc.FetchDependentsForView(empNum);
model.Spouses = _peopleSvc.FetchDependentsForView(empNum);
return View(model);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Employee(Models.EmployeeViewModel model)
{
if (!_empSvc.ValidateAndSaveName(model.Num, model.Name))
{
model.Dependents = _peopleSvc.FetchDependentsForView(model.Num);
model.Spouses = _peopleSvc.FetchDependentsForView(model.Num);
return View(model);
}
this.RedirectToAction(c => c.Index());
}
}
Все это казалось прекрасным, пока мы не начали создавать большие виды (40+ полей) со многими выпадающими списками и т.д. Поскольку на экранах было бы действие GET и POST (с возвратом POST-представления, если была ошибка проверки), мы будем дублировать код и делать ViewModels больше, чем они, вероятно, должны быть.
Я думаю, что альтернативой было бы получение данных через Сервис в ViewModel. Меня беспокоит то, что у нас были бы некоторые данные, заполненные из ViewModel, а некоторые из Controller (например, в приведенном выше примере, Name будет заполнено из контроллера, поскольку оно является опубликованным значением, тогда как зависимые и супруги будут заполнены через некоторые тип функции GetStaticData() в ViewModel).
Мысли?