【问题标题】:Where should I place my domain model to view model mapping code?我应该在哪里放置我的域模型来查看模型映射代码?
【发布时间】:2014-06-10 07:03:00
【问题描述】:

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

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

还有其他标准方法可以做到这一点吗?

【问题讨论】:

  • 您可能会发现我的回答 here 很有用。

标签: c# asp.net asp.net-mvc asp.net-mvc-4


【解决方案1】:

我更喜欢将映射逻辑放在视图模型 (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 已经“知道”如何以适合视图的方式表示模型,因此“知道”如何在两者之间进行映射陈述也属于那里。
  • @chiccodoro 同意,通常视图模型(dto)在 UI 项目中,域模型在服务器项目中,UI 项目添加对服务器项目的引用。
  • 唯一的事情,我个人会远离隐式运算符,因为它们会增加一些关于特定代码是在域模型还是视图模型上运行的混淆。我已经定义了两个方法FromModelToModel
  • 如何构建由多个领域模型组成的 ViewModel?
  • 当我有一个由其他两个模型组合而成的 SomeViewModel 时,我无法使用您的方法。我收到错误消息“预期可重载的一元运算符”。本质上,我正在尝试使用public static implicit operator SomeViewModel(Model1 model1, Model2 model2)
【解决方案2】:

由于映射并不总是微不足道的,我认为最好将其分离到视图模型之外的不同类中。

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

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

你也可以考虑使用 automapper 并从你的控制器调用它的 Map 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多