写点什么

不同观点:DTO 与领域对象

  • 2011-06-27
  • 本文字数:858 字

    阅读完需:约 3 分钟

自从 NHibernate 与 WCF 出现以来,.NET 开发者们就开始向统一的实体模型概念上不断靠拢。最后的结果就是同一个类可以作为 ORM 实体、WCF DTO 以及 MVC、MVP 与 MVVM 框架的模型。.NET Dependency Injection 的作者 Mark Seemann 认为这不见得是件好事。

问题的关键在于“在边界处,应用并不是面向对象的”。如你所见,大多数序列化技术都要求 public、默认的构造方法以及可写的属性。本质上,在设计 DTO 时,这些要求会迫使你打破封装和数据隐藏的原则。甚至连基本的不变性,如要求字段不为 null/ 不为空都不可能实现,因为 DTO 会忽略掉一切。Mark Seemann 继续证明自己的论断:

  • 服务共享模式与契约,而非类。
  • DTO 并不会破坏封装,以为他们根本就不是对象。

根据这种情况,Mark 提出了 3 种观点:

第 1 种观点是坚持已有的观念。为了消除隔阂,我们必须得开发一个转换层,用于将 DTO 转换为封装良好的领域对象。这正是书中的示例所采取的方式。然而,我越发觉得这种解决方案并不是最佳的。这会导致可维护性的问题(这也是我写书时所遇到的问题:当你写完后,你所知道的要比刚开始动笔时多不少,我并不是说书不好,只是想说它并不完美而已)。 第 2 种观点是不再将数据当作对象,将其看作是它自身所表示的结构化数据。如果我们所用的编程语言有单独的结构化数据概念就太好了。有趣的是,虽然 C#并没有这个概念,但 F#却有多种方式来建模数据结构而不涉及行为。或许这是更好的数据处理方式,我还要多尝试几次才行。

第 3 种观点是使用动态类型。在文章 Cutting Edge: Expando Objects in C# 4.0 中,Dino Esposito 介绍了通过动态方法来使用结构化数据,这可以更快速地自动生成代码并向结构化数据提供轻量级的 API。这种方法更有前途,它并没有提供编译期的反馈,但这只不过是一种安全上的错觉而已。我们需要通过单元测试来快速获取反馈,但我们一直都在使用 TDD,不是么?

如果你对面向对象设计与封装感兴趣,那就一定不能错过名为 Poka-yoke Design: From Smell to Fragrance 的系列文章。

查看英文原文: Differing Opinions: DTOs vs Domain Objects

2011-06-27 07:463441
用户头像

发布了 88 篇内容, 共 263.1 次阅读, 收获喜欢 8 次。

关注

评论

发布
暂无评论
发现更多内容

打造千亿文件量级的大规模分布式文件系统

Baidu AICLOUD

文件系统 分布式文件存储 元数据

探索生成式人工智能的前景

高端章鱼哥

人工智能 AIGC 生成式人工智能

GaussDB技术解读:应用无损透明(ALT)

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 8 月 PK 榜

大数据平台与数据仓库的五大区别

行云管家

大数据 数据仓库 数据安全 大数据平台

MegEngine 使用小技巧:Profiler使用手册

MegEngineBot

开源 性能优化

软硬件双向驱动 英特尔加速AI on PC落地

E科讯

2023开源和信息消费大赛新闻发布会在京召开

开放原子开源基金会

Microsoft Outlook 2021 for mac v16.76.2中文版

mac

苹果mac Windows软件 Outlook2021

生成式AI领先,实现客服机器人真智能

百度开发者中心

人工智能 机器人 生成式AI 文心一言

生成式AI:助力网络安全,挑战与机遇并存

百度开发者中心

人工智能 网络安全、 生成式AI 文心一言

生成式AI:业务流程的变革与机遇

百度开发者中心

人工智能 生成式AI 文心一言

生成式AI助力文学艺术创作

百度开发者中心

人工智能 艺术 文心一言

Presto 设计与实现(十二):SQL 逻辑计划

冰心的小屋

数据湖 presto 设计与实现 SQL Plan

Graph + LLM 实践指南|如何使用自然语言进行知识图谱构建和查询

悦数图数据库

数据库 图数据库

面试了38位Java候选人之后,我总结出了他们关于面试中的16条通病

程序员小毕

Java 程序员 面试 简历 八股文

业务需要咨询?开发遇到bug想反馈?开发者在线提单功能上线!

荣耀开发者服务平台

开发者 在线客服 工单 技术支持

Clang编译数据库信息扩展

maijun

Clang 编译数据库

没有永远的王者…Zig替代C,将成定局!

互联网工科生

C语言 C++ Zig语言

PHP/MySQL开发环境 MAMP Pro for Mac激活安装

胖墩儿不胖y

Mac软件

程序员常逛的17 个杀手级网站

专注前端开发

前端 大前端 网站

用友Fast by BIP领先实践全景图公布!

用友BIP

Fast by BIP 2023全球商业创新大会

iOS上架审核宝典:注意事项与实用工具分享

雪奈椰子

ios打包 IPA上传

​iOS上架审核宝典:如何避免被拒一次提交成功

ios

2023年广州国际大健康产品及健康食品展会

秋硕展览

2023健博会 保健用品展 护理用品

如何使用io_uring构建快速响应的I/O密集型应用?

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 8 月 PK 榜

TDD、BDD、ATDD都是什么、有什么区别?(上)

禅道项目管理

Graph + LLM|图数据库技术如何助力行业大语言模型应用落地

悦数图数据库

数据库 图数据库

生成式AI:重新定义生产力与创造力

百度开发者中心

人工智能 ChatGPT 生成式AI 文心一言

大数据平台三大优势详解-行云管家

行云管家

数据库 大数据 数据安全 大数据平台

万界星空科技|免费开源MES系统|自动排产管理

万界星空科技

开源 MES系统

不同观点:DTO与领域对象_SOA_Jonathan Allen_InfoQ精选文章