asp.net-mvc - 在哪里将 DTO 转换为 ViewModel?

标签 asp.net-mvc domain-driven-design viewmodel dto separation-of-concerns

我继承了一个 MVC2 项目,该项目使用相当标准且保存得很好的 DDD 模式。我也阅读了大量关于整个 DTO/ViewModel 争论的文章。

目前我们的 DTO 经常像 ViewModel 一样使用。老实说,这对我们正在做的事情没有什么影响,但我想在升级网站时使用正确的 ViewModel。

这是我的问题:

我们的“域”项目的模型当前保存实体并将 DTO 返回给我的 Controller 。现在我需要将该 DTO 映射到 ViewModel。我应该在哪里做这个?

  • 就在 Controller 中?
  • 在域项目中?
  • 其他地方?

我将 ViewModel 与“Web”项目中的 View 放在一起,因此在域项目中转换 DTO -> ViewModel 感觉不对。在 Controller 中这样做也感觉不对。

其他人做了什么?

编辑:

This question/answer 建议在 Controller 中处理它。确实很容易过度思考这一点。

最佳答案

DTO 通常是特定于技术的。例如,在 .NET 世界中,您的 DTO 可能用 DataContractDataMember 序列化属性进行修饰。此外,DTO 与返回它们的服务一起形成域的适配器,如 hexagonal architecture 。 。它们使您的域适应特定的传输技术,例如 HTTP,因此它们位于您的域之外。换句话说,域不应该了解 DTO - DTO 应该在单独的项目中定义。包含服务的项目应该具有将域对象映射到 DTO 的映射代码。

ASP.NET MVC 项目本质上是相似的 - 它使您的服务/DTO(或直接域对象)适应表示技术,特别是 HTML。因此,DTO 不应该知道 ViewModel。相反,MVC Controller 应该调用 DTO 和 ViewModel 之间的映射。这可以通过多种方式完成,但我发现效果最好的是 ViewModel 中接受 DTO 的构造函数。此外,在 Controller 操作保证创建要发送回服务的 DTO 的情况下,ViewModel 可以包含用于基于 ViewModel 创建 DTO 的方法。这包含 ViewModel 中最接近实际数据的所有映射代码 - information expert pattern 的实例。 。实现此目的的另一种方法是使用类似 AutoMapper 的内容。它使用基于约定的映射来避免样板代码。除非有必要,否则我会认为超出此范围的任何事情都太过分了。

在许多情况下,您的 ViewModel 最终看起来就像 DTO,但具有用于绑定(bind)和验证的 ASP.NET MVC 特定属性。尽管这看起来违反了 DRY ,这些实际上是独立的职责。

关于asp.net-mvc - 在哪里将 DTO 转换为 ViewModel?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11874097/

相关文章:

android - 在许多 fragment 之间向后导航的简单方法是什么?

c# - 我如何检查用户是否处于具有 MVC4 简单成员资格的几个不同角色中的任何一个?

asp.net-mvc - ApplicationDbContext - 它在项目中所属的位置

c# - OutputCache 序列化并发请求

architecture - 将DDD应用于Northwind数据库

c# - 在我的 MVC View 中获取 ViewModel 数据

c# - 帮助从控制台应用程序呈现 ASP.NET MVC View

domain-driven-design - 核心域和通用子域是否包含同一域模型的不同部分?

entity - DDD 聚合 : Entity holding identifier to Non-Root Entity in another Aggregate

android - 可以通过 Fragment 访问 Activity 的 AndroidViewModel 吗?