2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

不同观点: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:463586
用户头像

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

关注

评论

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

Android 框架解析:Picasso 核心功能实现原理

拭心

android Framework 内容合集 签约计划第二季 shixinzhang

Android 框架解析:EventBus 3.0 的特点与如何使用

拭心

android Framework 内容合集 签约计划第二季

随手记录一下消息队列的一些模型

『腾讯网』腾讯分分彩计划最准软件[手机乐乎]

天马行空

腾讯分分彩计划最准软件

JavaScript基础语法之对象的哪些事

你好bk

JavaScript 大前端 js 基础语法 12月日更

存储引擎漫话

ElvinYang

B-tree LSM-Tree Hash Index MySQL InnoDB

音视频理论(3)- 视频中图片和文字渲染坐标问题

liuzhen007

签约计划第二季

架构实战营毕业总结

白开水又一杯

#架构实战营

Rust 元宇宙 13 —— 客户端连接

Miracle

rust 元宇宙

Android 框架解析:EventBus 3.0 如何实现事件总线

拭心

android Framework 内容合集 签约计划第二季 shixinzhang

Android 框架解析:Picasso 源码基本架构

拭心

android Framework 内容合集 签约计划第二季 shixinzhang

Android 框架解析:OkHttp 请求原理基本认识

拭心

android Framework 内容合集 签约计划第二季 shixinzhang

终于有了一个人人可以访问的网站了

老表

WordPress 个人网站 跟老表学云服务器

Android 框架解析:深入理解 Retrofit 实现

拭心

android Framework 内容合集 签约计划第二季 shixinzhang

JavaScript数据结构实用集

devpoint

JavaScript 数据结构 内容合集 签约计划第二季

Android 框架解析:从 EventBus 中学到的精华

拭心

android Framework 内容合集 签约计划第二季 shixinzhang

Android 框架解析:热修复框架 Tinker 从使用到 patch 加载、生成、合成原理分析

拭心

android Framework 内容合集 签约计划第二季 shixinzhang

『腾讯网』网贷强制上岸后果[手机乐乎]

天马行空

网贷强制上岸后果

如何有效处理素材

将军-技术演讲力教练

『腾讯网』赛车飞艇平台[手机乐乎]

天马行空

赛车飞艇平台

Android 进阶之路:深入理解常用框架实现原理

拭心

android Framework 内容合集 技术专题合集 shixinzhang

音视频实战(4)- 常见流媒体服务器方案对比分析

liuzhen007

签约计划第二季

音视频实战(5)- FFmpeg 处理音视频常见问题集锦

liuzhen007

签约计划第二季

极客时间架构实战营 - 模块九及大作业

jjn0703

架构实战营

『腾讯网』极速飞艇游戏[手机乐乎]

天马行空

极速飞艇游戏

.NET 6新东西--PeriodicTimer

喵叔

28天写作 12月日更

为什么不上台?(5/28)

赵新龙

28天写作

音视频学习从理论到实战

liuzhen007

内容合集 签约计划第二季 技术专题合集

Git进阶(八):git stash 与 git add

No Silver Bullet

git 12月日更

【Promise 源码学习】第十二篇 - Promise.race 的实现

Brave

源码 Promise 12月日更

极客时间架构实战营总结

jjn0703

架构实战营

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