这听起来像是自动映射器的完美场景。您创建一个包含字段子集或真实模型的视图模型类,并让 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);
由于存在排除,这显然不太理想,但比手动完成整个事情要好得多。