Это звучит как идеальный сценарий для автопроизводителя. Вы создаете класс модели представления, который содержит подмножество полей или вашей реальной модели, и вы позволяете AutoMapper извлекать значения из объекта модели домена в ваш объект модели представления. Какие проблемы возникают у вас с этим подходом?
Рассмотрим этот пример:
Вот модель вашего домена и модель вашего представления
public class Person
{
public string FirstName
{ get; set; }
public string LastName
{ get; set; }
public string HomeNumber
{ get; set; }
public string Address1
{ get; set; }
public string Address2
{ get; set; }
}
public class PersonViewModel
{
public string FirstName
{ get; set; }
public string LastName
{ get; set; }
public string HomeNumber
{ get; set; }
}
Вот ваше отображение, вы должны создать отображение в обоих направлениях от dm-> vm и vm-> dm.
Из того, что я видел при использовании Automapper, видно, что если вы сопоставляете объект A с B, а у B есть свойство, которого у A нет, оно будет сброшено. Поэтому, когда я создаю карту, я указываю ей игнорировать эти недостающие свойства. Я не эксперт Automapper, поэтому могу использовать его неправильно.
Mapping
Mapper.CreateMap<Person, PersonViewModel>();
// Automapper will reset values in dest which don't exist in source, so be sure to ignore them!
Mapper.CreateMap<PersonViewModel, Person>()
.ForMember(dest => dest.HomeNumber, opt => opt.Ignore());
Окончательное использование:
Person p = new Person()
{
FirstName = "First",
LastName = "Last",
Address1 = "add 1",
Address2 = "add 2"
};
PersonViewModel pvm = Mapper.Map<Person, PersonViewModel>(p);
// Map to a new person
Person p2 = Mapper.Map<PersonViewModel, Person>(pvm);
// Map to the existing person just to update it
Person p3 = new Person()
{
HomeNumber = "numberHere"
};
// This will update p3
Mapper.Map<PersonViewModel, Person>(pvm, p3);
Из-за исключения это явно не идеально, но гораздо лучше, чем делать все вручную.