BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

不同观点:DTO与领域对象

| 作者 Jonathan Allen 关注 593 他的粉丝 ,译者 张龙 关注 14 他的粉丝 发布于 2011年6月28日. 估计阅读时间: 2 分钟 | AICon 关注机器学习、计算机视觉、NLP、自动驾驶等20+AI热点技术和最新落地成功案例。

自从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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

分享:Silverlight 之 MVVM! by 高 翌翔

不久前的几个月里一直在参与一个基于Silverlight和WCF的项目,当引用WCF服务成功后,VS会自动生成代理类及若干相关DTO类文件。在MVVM模式中,DTO被视为Model,进而它会被组合到相应的ViewModel中以便绑定时使用,最后ViewModel被设置为View(UserControl)的DataContext。其中,ViewModel恰恰起到了转换层的作用。而调用WCF接口仍会传入Model即DTO,从而有效避免了不必要的数据转换工作。

Re: 分享:Silverlight 之 MVVM! by lian zhao

所谓自动生成的代理类是怎么来的呢?还不就是data contract。所以这里讨论的DTO具体到wcf的情况我认为就是data contract。作者的观点在这种情况下就进一步的编程了:领域模型不应该是data contract。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

2 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT