目前,我在控制器文件中使用私有静态方法将域模型映射到视图模型,反之亦然。如下所示:
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;
}
有没有其他标准方法可以做到这一点?
答案 0 :(得分:19)
我更喜欢将映射逻辑放在视图模型(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;
答案 1 :(得分:4)
由于映射并不总是微不足道,我认为将它分成除viewmodel之外的其他类可能更好。
这样每个班级都有自己的一个责任。您可能希望向域模型添加扩展方法,例如:
public static MyViewModel ToViewModel(this MyDomainModel model)
{
// mapping code goes here
}
您也可以考虑使用automapper并从控制器调用它的Map方法。