【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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

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

关注

评论

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

一周信创舆情观察(4.26~5.5)

统小信uos

全新 Jira 系列,适用于所有团队!

Atlassian

DevOps 敏捷 Atlassian Jira

看完阿里P7技术大牛的JVM知识点总结,竟帮我斩获了3份大厂Offer

飞飞JAva

Java JVM

rocketmq优雅停机往事

捉虫大师

nmon和nmon analyser的网盘下载安装与使用

InfoQ_Springup

工具

模块2学习总结

TH

架构实战营

腾讯T6!万字长文体系化讲解Spring源码,码农:太透彻了,学会了

牛哄哄的java大师

Java

如何在苹果M1上安装使用FL Studio

奈奈的杂社

编曲 教程分享 编曲软件

Tars Java 客户端源码分析

vivo互联网技术

Java TARS RPC架构

【HDC.Cloud 2021】边云协同,打通AI最后一公里

华为云原生团队

人工智能 开源 云原生 边缘计算 华为云

爬虫实战教程:采集微信公众号文章

前嗅大数据

大数据 爬虫 数据采集 爬虫教程

打破思维定式(三)

Changing Lin

智能会话机器人:SaaS 平台的设计与思考

极客志

自然语言处理 chatbot 聊天机器人 智能会话机器人

如何快速制作短视频?拥有这个神器,轻松搞定!

奈奈的杂社

短视频 视频剪辑 自媒体

轶事

言未卜

从狗狗币说起 看区块链的未来发展方向

CECBC

狗狗币

模块2作业 微信朋友圈高性能复杂度

TH

架构实战营

超详细教程:SpringBoot整合MybatisPlus

华为云开发者联盟

Java spring springboot 代码 MyBatisPlus

“红黑树”详解丨红黑树的应用场景

Linux服务器开发

后端 红黑树 Linux服务器开发 Linux内核 红黑树应用场景

架构实战营 模块三作业

netspecial

架构实战营

关于安卓设备声音远程传输的解决方案

行者AI

云平台

Offer收割机!阿里P7大神甩出JSP实战笔记,网友:信息量过大

飞飞JAva

Java

“服务可达的数据链DNA” ,打通从代码到用户的“任督二脉”

博睿数据

数据链DNA

马丁格尔策略交易软件源码,量化策略系统开发

在线体验四大名著情景(地图、游戏)

不脱发的程序猿

开源 程序人生 四大名著

STM32低功耗模式下GPIO如何配置最节能?

不脱发的程序猿

嵌入式 stm32 单片机 低功耗模式

Hive解析Json数组超全讲解

五分钟学大数据

hive 5月日更

为何“低代码”频频引发业界热议?

优秀

低代码

深入浅出 LVS 负载均衡系列(二):DR、TUN 模型原理

UCloud技术

负载均衡

运维五一不加班,从一套On-Call响应机制开始!

睿象云

运维 告警 智能运维 告警设置 告警管理

架构实战模块三作业

Geek_649372

架构实战营

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