写点什么

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

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

关注

评论

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

从市场需求目标看数据分析演进方向

华为云开发者联盟

人工智能 华为云

一文带你认识CSS

未见花闻

6月月更

python程序设计思想

左手の明天

Python 面向对象

InfoQ 极客传媒 15 周年庆征文|海王的鱼塘是怎样炼成的

知心宝贝

人工智能 大数据 运维 前端 InfoQ极客传媒15周年庆

5分钟了解红队如何搜索网络情报

穿过生命散发芬芳

6月月更 攻防演练

如何往 Kafka 发送大消息?

Se7en

Docker 实用技巧二

Nick

Docker 容器 实用技巧 6月月更 实操

跟着官方文档学 Python 之:3.12 新变化

甜甜的白桃

Python python3.x 6月月更

LabVIEW Arduino无线蓝牙遥控智能车(项目篇—2)

不脱发的程序猿

LabVIEW Arduino VISA 无线遥控智能小车 无线蓝牙遥控智能车

依图在实时音视频中语音处理的挑战丨RTC Dev Meetup

声网

音视频 RTC Dev Meetup 语音处理

如何设计BI平台

奔向架构师

数据仓库 商业智能 6月月更

flutter系列之:深入理解布局的基础constraints

程序那些事

flutter 程序那些事 6月月更

配置swagger

卢卡多多

swagger 6月月更

【愚公系列】2022年06月 通用职责分配原则(五)-控制器原则

愚公搬代码

6月月更

在 Pisa-Proxy 中,如何利用 Rust 实现 MySQL 代理

SphereEx

MySQL 数据库 rust

考试试卷存储方案

极客土豆

倒计时1天,龙蜥社区走进Intel MeetUp 即将开播!直播大奖等你来拿

OpenAnolis小助手

开源 intel Meetup 龙蜥社区 线上直播

Android 自定义View之展开收起的Layout

yechaoa

android 自定义view 6月月更

python逆序输出和进制转化(小白也能看懂)

写代码两年半

Python 6月月更

Java—JVM

武师叔

6月月更

关于微服务通信的一些Tips

阿泽🧸

微服务 6月月更

挑战最全 Apache Doris 学习资料,你想要的都在这里了!

SelectDB

数据库 Doris apache doris 技术干货

LabVIEW Arduino ZigBee无线气象站(项目篇—3)

不脱发的程序猿

物联网 LabVIEW Arduino ZigBee无线气象站 无线传感器

「 2022 精益软件工程大会」圆满闭幕,观测云奉献精彩主题演讲

观测云

百度团队CSS编码规范

sean77

GCC 为龙芯 CPU的预定义宏

mazhen

c++ RocksDB GCC 龙芯

GetxController 生命周期详解

岛上码农

flutter ios 前端 安卓 6月月更

力扣每日一练之二维数组下篇Day5

京与旧铺

6月月更

2022-06微软漏洞通告

火绒安全

微软 漏洞 安全漏洞

数据库每日一题---第15天:未消费的顾客

知心宝贝

数据库 程序员 前端 后端 6月月更

leetcode 413. Arithmetic Slices 等差数列划分

okokabcd

LeetCode 算法与数据结构

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