写点什么

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

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

关注

评论

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

系统设计系列之如何设计一个短链服务

看山

架构 面试 分布式 架构设计 短链服务

老哥,您看我这篇Java集合,还有机会评优吗?

苹果看辽宁体育

Java 后端

智能膜切机,解决手机贴膜行业难题

Geek_116789

微软苏州集体抵制来自阿里、华为的跳槽者:请停止你的“奋斗逼”行为!网友:看到 955 不加班的公司名单,我酸了

程序员生活志

程序员 加班 996

Vue中使用装饰器,我是认真的

前端有的玩

Java Vue 装饰器

华为云GaussDB(DWS)内存知识点,你知道吗?

华为云开发者联盟

数据库 大数据 数据 内存 华为云

ARTS打卡 第10周

引花眠

ARTS 打卡计划

英特尔®AI计算盒参考设计发布 加速智能边缘崛起

最新动态

JVM系列之:JIT中的Virtual Call

程序那些事

Java JVM JIT

技术管理者带团队的几个实用技巧

Phoenix

团队管理 企业文化 团队 价值观

授人以渔:stm32资料查询技巧

华为云开发者联盟

架构 armv8 芯片 华为云 二进制

云小课 | IPv4枯了,IPv6来了

华为云开发者联盟

IP 公有云 虚拟私有云 华为云 虚拟化

数据库系统设计概述

码哥字节

数据库 redis mongodb elasticsearch 数据库设计

计算机网络基础(十一)---网络层-OSPF协议

书旅

计算机网络 网络 协议栈 OSPF

实用!一键生成数据库文档,堪称数据库界的Swagger

程序员小富

Java MySQL

架构师训练营第八章-作业1

A Matt

手写一个重入锁

诸葛小猿

synchronized CAS 重入锁 compareAndSwap ReentrantLock

《深度工作》学习笔记(3)

石云升

学习 深度工作 工作哲学

秒杀系统问题与方案设计

superman

秒杀 架构总结

<<前端进阶篇>> PDF 出炉了 — 「阿宝哥」,精心准备的 6 万多字 170 页的前端进阶资料

阿宝哥

大前端

飞天茅台超卖事故:Redis分布式锁请慎用!

程序员生活志

redis 分布式

你问我答:微服务治理应该如何去做?

BoCloud博云

容器 微服务 PaaS API 博云

在人工智能时代追逐的“后浪”

华为云开发者联盟

程序员 AI 开发者 技术社区 华为云

第九周

hdhdh

将信将疑,将中台进行到底

郭华

Newbe.Claptrap 框架如何实现多级生命周期控制?

newbe36524

架构 微服务 .net core ASP.NET Core

什么?不写代码也能做功能开发! -RUOYI 教程二

Java_若依框架教程

Java 无代码开发 若依

初识分布式:MIT 6.284系列(一)

Kerwin

分布式 MIT 28天写作

数据人必须知道的SQL概念(A—Z)

大唐小生

sql 数据 职场成长

基于 Golang的侵入式 Opentracing实现全链路追踪 ----实践篇

是老郭啊

财务分析与主要的模型

松子(李博源)

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