HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

TiDB Vector 太香啦:以图搜图初体验!

PingCAP

数据库 TiDB

30 秒出服装设计稿,森马用函数计算+AIGC 整“新活”!

阿里巴巴云原生

阿里云 Serverless 云原生 函数计算

ubuntu22.04文件管理器nautilus配置默认终端为alacritty

百度搜索:蓝易云

Linux ubuntu 运维 Alacritty Nautilus

事业-最佳实践-编码-声明规范

南山

2024年4月文章一览

codists

编程人

嵌入式Linux的学习误区

梦笔生花

Linux 嵌入式 处理器

mysql索引条件下推 、 count(*)、count(1)、IN 、exists等

百度搜索:蓝易云

MySQL 云计算 Linux 运维 云服务器

null是原始类型,但为什么typeof null的结果是object?

Geek_fed966

Docker私有镜像仓库(Harbor)安装

百度搜索:蓝易云

Docker Linux 运维 Web Harbor

Required request parameter ‘XXX‘ for method parameter type String is not present

源字节1号

开源 软件开发 前端开发 后端开发 小程序开发

事业-最佳实践-编码-异常处理规范

南山

异常 异常处理

事业-最佳实践-编码-注释规范

南山

代码注释 注释 添加注释 注释规范

1/28 业务系统的安全设计

hackstoic

系统设计 安全 TGO写作小组28天挑战

前端面试题 - 如何实现promise?

Geek_fed966

在线音频,没有新故事

自象限

Linux设备驱动系列(九)——procfs文件系统

Linux内核拾遗

文件系统 linux开发 Linux内核 设备驱动 procfs

怎么给程序员定 KPI ?原则和最佳KPI

爱吃小舅的鱼

软件开发 KPI

大模型探索:阿里向量检索服务DashVector

程序员架构进阶

架构 向量检索 大模型 5月月更 通义千问

解决SpringBoot项目war部署到tomcat下无法Nacos中注册服务问题

百度搜索:蓝易云

tomcat Linux 运维 Spring Boot nacos

银行核心背后的落地工程体系丨Oracle - TiDB 数据迁移详解

PingCAP

数据库 TiDB

巧用 TiCDC Syncpiont 构建银行实时交易和准实时计算一体化架构

PingCAP

数据库 TiDB

事业-最佳实践-编码-CR认知

南山

CR CodeReview

ACK One x OpenKruiseGame 全球游戏服多地域一致性交付最佳实践

阿里巴巴云原生

阿里云 开源 容器 云原生

php解决time()时间戳超过2038年出错问题的解决方案

百度搜索:蓝易云

php 云计算 Linux 运维 Web

基于Gin框架的HTTP接口限速实践

百度搜索:蓝易云

Linux 运维 HTTP 云服务器 gin

2024-05-01:用go语言,给定两个长度为偶数n的整数数组nums1和nums2, 分别移除它们各自的一半元素, 将剩下的元素合并成集合s。 找出集合s中可能包含的最多元素数量。 输入:nums

福大大架构师每日一题

福大大架构师每日一题

使用ICMP协议来判断UDP端口的存活状态

百度搜索:蓝易云

Linux 运维 udp 云服务器 ICMP

为什么公共事业机构会偏爱 TiDB :TiDB 数据库在某省妇幼健康管理系统的应用

PingCAP

数据库 TiDB

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