Где я должен разместить свою модель домена для просмотра кода сопоставления модели?

В настоящее время я использую приватные статические методы в своем файле контроллера для сопоставления модели домена для просмотра модели и наоборот. Как ниже:

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 из своего контроллера.