【问题标题】:Bestpractice - Mixing View Model with Domain Model最佳实践 - 将视图模型与域模型混合
【发布时间】:2011-03-06 21:30:36
【问题描述】:

将视图模型与域模型混合是否合理?

也就是说,视图模型对象包含一些域模型对象(不是相反!)

【问题讨论】:

    标签: asp.net-mvc model viewmodel domain-model


    【解决方案1】:

    我倾向于创建单独的视图模型,其中包含我需要在视图中显示的内容。 AutoMapper 是一个让这一切变得更容易的创建工具。

    【讨论】:

    • 您能否更详细地解释一下为什么不将视图模型对象与域模型对象混合使用?优点和缺点...
    • 我的领域模型类通常有很多状态修改器方法。我不想将这些直接暴露给视图层,以防止混淆应该从哪里调用这些方法。我要求我的所有域命令都通过一个服务层,该服务层连接适当的数据库会话、安全检查等。但是我通常会将值对象从我的域直接公开到 MVC 层。读取与写入模型 (CQS) 之间的清晰分离也有助于保持这种状态。
    • 我尝试让每个视图都有一个视图模型,并且该视图模型具有创建视图所需的内容。该视图模型可以由多个领域模型组成,并且只使用每个领域的一些字段。
    【解决方案2】:

    通常,您必须在视图模型中引用您的领域模型,或者至少在控制器中加载领域模型并将信息传递给您的视图模型。

    我更喜欢让控制器和视图尽可能简单/笨拙,因为域模型和视图模型都更容易测试。

    所以,我经常在我的视图模型中引用我的领域模型。有时我使用聚合,有时我只是复制属性(在某些项目中仅使用普通旧代码,在其他项目中使用自动映射器)

    【讨论】:

    • 但是这样做是合理的,并且只有当您的域模型很好地满足视图的需求时才能正常工作。我听说视图模型应该只包含已经格式化的字符串属性。顺便说一句,您不必复制属性。我建议您阅读有关 AutoMapper 的信息,只需 google 一下!恕我直言,这是一个很棒的工具。
    • 注意我说在我复制的一些项目中,在其他项目中我使用自动映射器,特别是 AutoMapper :) 另外,我基本上按照您的描述进行操作。我不使用我的领域模型作为我的视图模型。我们曾经这样做过,它咬了我们好几次。
    • 所以我理解你的正确,你混合视图模型对象和域模型对象。并且您将两者(即包含视图模型对象和域模型对象的聚合)也发送到视图?
    • 基本上,是的。视图模型是为了准确地为视图服务。有时我会发送整个域对象,有时我只发送视图需要的位。考虑到 View 的要求,无论做什么似乎最有意义。
    • 好的。你的方法是否违反了“关注点分离”的规则?
    猜你喜欢
    • 1970-01-01
    • 2014-11-27
    • 2011-09-16
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2011-06-21
    • 2020-09-19
    • 2010-12-03
    相关资源
    最近更新 更多