Где я должен разместить свою модель домена для просмотра кода сопоставления модели?
В настоящее время я использую приватные статические методы в своем файле контроллера для сопоставления модели домена для просмотра модели и наоборот. Как ниже:
public ActionResult Details(int personID)
{
Person personDM = service.Get(personID);
PersonViewModel personVM = MapDmToVm(personDM);
return View(personVM);
}
private static PersonViewModel MapDmToVm(Person dm)
{
PersonViewModel vm;
// Map to VM
return vm;
}
Есть ли другой стандартный способ сделать это?
Ответы
Ответ 1
Я предпочитаю помещать логику сопоставления в класс модели представления (dto), потому что мы хотим, чтобы модель домена была максимально чистой, а также модель домена могла менять сверхурочную работу.
public class Person
{
public string Name {get; set;}
}
public class PersonViewModel
{
public string Text {get; set;}
public static implicit operator PersonViewModel(Person dm)
{
var vm = new PersonViewModel { Text = dm.Name };
return vm;
}
public static implicit operator Person(PersonViewModel vm)
{
var dm = new Person { Name = vm.Text };
return dm;
}
}
и использовать его в контроллере без явного литья.
Person dm = service.Get(id);
PersonViewModel vm = dm;
Ответ 2
Поскольку отображение не всегда тривиально, я думаю, что лучше было бы разделить его на другой класс, отличный от viewmodel.
Таким образом, у каждого класса есть своя отдельная ответственность. Возможно, вы захотите добавить метод расширения к своей модели домена, например:
public static MyViewModel ToViewModel(this MyDomainModel model)
{
// mapping code goes here
}
Вы также можете использовать automapper и вызвать его метод Map из своего контроллера.