C# 我应该将域模型放在哪里以查看模型映射代码?

C# 我应该将域模型放在哪里以查看模型映射代码?,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,目前,我在控制器文件中使用私有静态方法将域模型映射到视图模型,反之亦然。如下图所示: public ActionResult Details(int personID) { Person personDM = service.Get(personID); PersonViewModel personVM = MapDmToVm(personDM); return View(personVM); } private static PersonViewModel MapDm

目前,我在控制器文件中使用私有静态方法将域模型映射到视图模型,反之亦然。如下图所示:

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;
}

是否有其他标准方法可以做到这一点?

我更喜欢将映射逻辑放在视图模型(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;

由于映射并不总是琐碎的,因此我认为最好将其划分为不同的类,而不是viewmodel

这样,每个类都有自己的单一责任。您可能希望向域模型添加扩展方法,例如:

public static MyViewModel ToViewModel(this MyDomainModel model)
    {
      // mapping code goes here
    }

您也可以考虑使用AutoPAPER并从控制器调用它的MAP方法。

您可能会发现我的答案是有用的。我个人也更喜欢这种方式,认为VIEW模型已经“知道”如何以适合视图的方式来表示模型,所以“知识”。关于如何在这两个表示之间映射的问题也属于这里。@chiccodoro同意,通常视图模型(dto)在UI项目中,域模型在服务器项目中,UI项目向服务器项目添加引用。唯一的问题是,我个人不会使用隐式操作符,因为它们可能会对某段代码是在域模型上操作还是在视图模型上操作增加一些混淆。我定义了两种方法,分别是
FromModel
ToModel
。您如何构建由多个域模型组成的ViewModel?当我有一个SomeViewModel,它是两个其他模型的组合时,我无法使用您的方法。我得到了一个错误,“期望重载一元运算符”。本质上,我试图使用
公共静态隐式操作符SomeViewModel(Model1 Model1,Model2 Model2)