将 DTO 映射到域对象的最佳实践?

2024-02-05

我看到很多与映射相关的问题DTOs https://en.wikipedia.org/wiki/Data_transfer_object到域对象,但我觉得他们没有回答我的问题。我以前使用过很多方法并有自己的意见,但我正在寻找更具体的方法。

情况:

我们有很多领域对象。我们使用 CSLA 模型,因此我们的域对象可能非常复杂,并且它们包含自己的数据访问。您不想通过网络传递这些内容。我们将编写一些新服务,这些服务将以多种格式(.Net、JSON 等)返回数据。出于这个(以及其他原因),我们还创建了一个精益的数据传输对象来在网络上传递。

我的问题是:DTO和Domain对象应该如何连接?

我的第一反应是使用Fowler,DTO 模式型解决方案 http://martinfowler.com/eaaCatalog/dataTransferObject.html。我已经看过很多次这样的做法,我感觉很对。域对象不包含对 DTO 的引用。调用外部实体(“映射器”或“汇编器”)来从域对象创建 DTO。通常有一个ORM https://en.wikipedia.org/wiki/Object-relational_mapping在域对象方面。这样做的缺点是“映射器”对于任何实际情况都会变得极其复杂并且可能非常脆弱。

提出的另一个想法是域对象“包含”DTO,因为它只是一个精简的数据对象。域对象属性将在内部引用 DTO 属性,并且可以根据需要返回 DTO。我看不出这有什么问题,但感觉不对。我看过一些文章,人们使用NHibernate https://nhibernate.info/似乎使用了这种方法。

还有其他方法吗?上述方法之一值得使用吗?如果是或不是,为什么?


当您仅支持单个映射时,在域和 DTO 之间使用映射器的好处并不明显,但随着映射数量的增加,将该代码与域隔离有助于使域更简单、更精简。您不会因大量额外的权重而使您的域变得混乱。

就我个人而言,我尝试将映射保留在我的域实体之外,并将责任放在我所说的“管理器/服务层”中。这是位于应用程序和存储库之间的层,提供业务逻辑,例如工作流协调(如果您修改 A,您可能还必须修改 B,以便服务 A 可以与服务 B 一起使用)。

如果我有很多可能的结束格式,我可能会考虑创建一个可使用访问者模式的可插入格式化程序,例如转换我的实体,但我还没有发现需要任何如此复杂的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 DTO 映射到域对象的最佳实践? 的相关文章

随机推荐

  • SOA 服务发现 (UDDI) 在实践中如何工作?

    我只是在阅读有关 SOA 的内容 并且经常提到服务注册中心 UDDI 听起来不错 但是实际使用起来如何呢 注册表是否意味着将逻辑服务与其物理实现 端口 URL 等 分离 注册表是否是供寻找有趣服务的人浏览的 硬连线是 错误的 吗 应用 它使
  • 可以对枚举进行子类化以添加新元素吗?

    我想获取一个现有的枚举并向其中添加更多元素 如下所示 enum A a b c enum B extends A d B is a b c d 这在Java中可能吗 不 您不能在 Java 中执行此操作 抛开其他的不说 d那么大概是一个实例
  • 从FTP python读取缓冲区中的文件

    我正在尝试从 FTP 服务器读取文件 该文件是一个 gz文件 我想知道在套接字打开时是否可以对此文件执行操作 我尝试遵循两个 StackOverflow 问题中提到的内容读取文件而不写入磁盘 https stackoverflow com
  • 更改 IntelliJ 12 中的默认 Web 应用程序目录

    从输出中 我得到 信息 部署 Web 应用程序目录 C Program Files Apache Software Foundation Tomcat 7 0 webapps manager 我需要它部署的是 root 而不是 manage
  • geom_point 有很多数据点,绘图的文件大小太大。

    我有一个包含许多数据点的散点图 当我尝试放大或保存为 pdf 格式时 打开时间很长 而且 pdf 太大 如何通过保持绘图的相同可视性来减小文件大小或使绘图更轻 这是一个例子 library ggplot2 df lt data frame
  • 为什么.NET SmtpClient发送的邮件缺少Message-Id?

    这是我在 App Config 中的 SMTP 设置
  • ']' 标记之前的预期表达式?

    我有以下行发送参数args and length到一个名为largest printf Largest is d n largest args length 当我尝试运行此程序时 出现以下错误 error expected expressi
  • PHP 将 psd 转换为 jpg,选择图像图层

    我希望能够选择将 PSD 图像中的哪些图层合并到最终的 JPG 输出图像中 我可以将图像中的所有图层合并为 im new Imagick test psd im gt flattenImages im gt setImageFormat j
  • fgets() 返回 NULL 是否符合短缓冲区要求?

    在单元测试中 函数包含fgets 当缓冲区大小时遇到 意外结果n lt 2 显然这样的缓冲区大小是愚蠢的 但测试正在探索极端情况 简化代码 include
  • 如何测试iOS应用是否支持IPv6? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有 2015 年和 2014 年构建的应用程序 如何测试它们的 IPv6 性能 如果我的应用程序不支持 IPv6 我该怎么办 我的应用程序
  • Vitest错误“TypeError:无法读取未定义的属性(读取'resolve')”(router.resolve)

    我有一个非常基本的测试 但是当我尝试安装组件时它会抛出以下错误const wrapper mount HomeHeader 我已经粘贴了我的 vite 配置 测试 组件和包 这个错误发生时没有更新我的 vite 配置 但我继续更新了配置te
  • 为什么以 null 作为回调的 array_map() 创建一个“数组的数组”?

    今天我了解到一个特殊案例array map 在 PHP 中 文档中作为旁注提到了这一点 示例 4 创建数组的数组 上面的例子将输出 Array 0 gt Array 0 gt 1 1 gt one 2 gt
  • 如何在 Libgdx 中支持 OpenGL ES GL10、GL11 和 GL20?

    我正在编写一个使用 GL10 的 3d 游戏 但我希望该应用程序支持 GL11 或 GL20 如果可用 支持这三者的最佳设计是什么 或者这是一个愚蠢的差事 我应该只专注于支持一个版本 我当前的想法是将 render 函数拆分为 render
  • 故事板和笔尖兼容吗?

    我可以在我的所有应用程序中使用故事板 然后将其推送到一个笔尖 还是不可能同时使用这两个笔尖 故事板和 nib 可以在一个应用程序中一起使用 但如果您的部署目标低于 iOS 5 那么它将无法工作 故事板仅适用于 iOS 5 x 当然 您需要自
  • 启动另一个 Windows 应用商店应用程序

    当用户单击我的应用程序中的按钮时 是否可以启动不同的 Windows 应用商店应用程序 是的 您可以从您的应用程序启动其他 Windows 应用商店应用程序 例如 Bing 地图 地图应用程序支持协议激活 这意味着您可以使用特殊的 url
  • Apple 多个推送通知在通知托盘中不可见

    我基本上想在同一个应用程序中在 iOS 的通知托盘中显示多个推送通知 如果我的数据已打开 同时通过 APNS 触发推送通知 则此方案有效 但仅收到最新的数据 以防我离线并在一段时间后回来 此功能已得到 APNS 文档的确认 然而 这在 Wh
  • Laravel 如何使用另一台服务器作为文件存储

    我正在使用 Laravel 7 6 我在每台服务器中有两个 Laravel 项目 服务器是普通服务器 既不是 AWS 也不是 Digital Ocean 只是专用服务器 项目 1 位于服务器 1 中 项目 2 位于服务器 2 中 我的问题是
  • Servicereferences.clientconfig 更改值 silverlight

    我有一个 servicereference clientconfig 现在 我的安装团队正在为我的 silverlight 应用程序创建安装 这是一个问题 因为在 servicereference clientconfig 中有一组 Web
  • c# - 关闭浏览对话框导致表单关闭

    我有一个通过以下方式显示的表格 ShowDialog 表格没有CancelButton指定的 当我打开一个BrowseDialog从窗体中 然后关闭BrowseDialog 表格也被关闭 我怎样才能防止这种情况发生 单击 浏览 按钮时 br
  • 将 DTO 映射到域对象的最佳实践?

    我看到很多与映射相关的问题DTOs https en wikipedia org wiki Data transfer object到域对象 但我觉得他们没有回答我的问题 我以前使用过很多方法并有自己的意见 但我正在寻找更具体的方法 情况