这听起来像是automapper的完美应用场景。您创建一个包含真实模型字段子集的视图模型类,然后让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专家,所以可能使用不正确。
映射
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);
Person p2 = Mapper.Map<PersonViewModel, Person>(pvm);
Person p3 = new Person()
{
HomeNumber = "numberHere"
};
Mapper.Map<PersonViewModel, Person>(pvm, p3);
由于这种排除方式,显然不是最理想的解决方案,但比全手动完成要好得多。