写点什么

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

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

关注

评论

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

区块链盲盒游戏app软件开发|盲盒游戏软件介绍

量化系统19942438797

区块链 智能合约 盲盒

新时代大视频产业的底座,视频云创变了什么?

阿里云视频云

阿里云 直播技术 视频制作 视频流 视频云

百分点大数据技术团队:BI嵌入式分析实践

百分点科技技术团队

BI 百分点科技 嵌入式分析

MapReduce高阶 分区、排序,Combine

Mike

架构实战营模块1作业

^_^

架构实战营

NFT盲盒玩法详解|盲盒系统开发

Geek_23f0c3

DAPP智能合约交易系统开发 NFT 盲盒

致远互联2021年中报:扎根协同的广阔天地,撸起袖子加油干

海比研究院

Google官方bazel构建工具的安装

Changing Lin

8月日更

Tapdata Cloud 版本上新!率先支持数据校验、类型映射等6大新功能

tapdata

MySQL nosql schema

细节爆炸!腾讯用13个案例实战讲明白MySQL,没想到这么全

Java~~~

Java MySQL 数据库 架构 面试

GitHub阅读量最高的文章竟是图解Java,不愧是Alibaba内部资料

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

深入了解RocketMQ之过滤器

邱学喆

bloomfilter TAG过滤 SQL92

FL Studio中钢琴卷帘窗的工具的使用

懒得勤快

程序员应该专注技术还是转管理?

石云升

职业规划 职场经验 8月日更

分享 10 个高星的创意项目!

程序员鱼皮

Java Python 数据库 大前端 Go 语言

算法毕业总结

Geek_Gu

6年Java经验,4面阿里定级P7,多亏阿里13万字+脑图+源码面试笔记

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

游戏开发者的通关之旅,华为AGC for Games带来了什么?

叶落便知秋

微信开源C/C++ RPC框架PhxRPC

OpenIM

webrtc 即时带宽评估器(BitrateEstimator)

webrtc developer

WebRTC

融云 X-Live 系列直播启动,遇见通信的无限可能

融云 RongCloud

开发者 音视频 通信 融云 即时通信

【等保知识】等保三级要求多少分?几分能过?

行云管家

网络安全 等保 等级保护

AI加持数据管理服务DAS,让数据库运维更“聪明”,DBA更轻松

华为云数据库小助手

GaussDB dba 华为云DAS 华为云数据库

疫情下的人生百态

6979阿强

图计算 GraphScope 新冠

架构设计-模块一

逝水流

架构

百分点感知智能实验室:语音识别技术发展阶段探究

百分点科技技术团队

语音识别 百分点科技 感知智能

The Data Way Vol.3|做到最后只能删库跑路?DBA 能做的还有很多

SphereEx

数据库 开源

ipfs矿机是什么?ipfs矿机挖出的币能交易吗?

区块链 分布式存储 ipfs挖矿 ipfs矿机 filecoin挖矿

项目中全局变量的灵活用法 12/100 发布文章

CodeNongXiaoW

48W字?GitHub上下载量破百万的阿里:图解Java、网络、算法笔记

公众号_愿天堂没有BUG

Java 编程 程序员 架构 面试

高安全等级网络是什么意思?有什么特点?

行云管家

网络安全 数据安全 安全事故 安全等级

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