InfoQ

新闻

SOA与DDD存在共生现象吗?

作者 Boris Lublinsky译者 徐涵 发布于 2008年9月17日 下午10时2分

社区
SOA
主题
设计
标签
领域驱动设计,
领域建模,
服务设计
随着SOA渐受欢迎、在企业架构里扮演重要角色,形势愈加明显,即它得着手利用其他相关学科取得的进步。这一观点在一次关于SOA与DDD(Domain Driven Design,领域驱动的设计)关系的讨论中得到了印证。

SOA是:

一种架构风格,它提倡设计与业务齐合的企业服务,并将这些服务作为设计、构建、构思企业业务方案的核心单元

DDD是:

一种思考方式和一组优先考虑事项,它致力于加快那些涉及复杂领域的软件项目

Trond-Eirik就二者表面上的共性提出以下问题,从而引发了本次讨论:

你们认为SOA和DDD这两个概念有何异同?它们是满足彼此需求的完美搭配吗?它们是互斥概念吗?也就是说,用了DDD,就不能用SOA了?它们解决或属于问题域里的不同部分吗?还是,它们解决或属于问题域里的相同部分?

用户名为“moffdub”的网友回答说:SOA和DDD之间有着很强的互补性: 

DDD是一种开发部署单元(单个应用)的方法。SOA是一种将多个部署单元粘合在一起的方法。

Ashley Fernandes提出了另一种综合两者的方式,他认为DDD是一种定义业务服务的技术:

我认为DDD里的服务层(service layer)跟UDDI里的WSDL服务非常接近。正因如此,DDD和SOA可以很好地共存。

Tomas Karlsson分享了他综合运用DDD和SOA的实际经验。他建议以纯DDD方法开始,然后创建实现了领域对象的对象(POJOs或无状态beans),并将它们暴露为服务。最终,他创建的是

一个(也可以是一组)具有明确职责的服务,即为给定对象上的增、查、改、删(CRUD)操作进行后端处理。尽早拥有这样的服务,将尽早给你的项目增加稳定性。

按照Colin Jack的说法,尽管SOA与DDD之间完全可以有共生关系,但在实现时要相当谨慎。特别地,他指出,提供实体服务(entity service)的想法会跟DDD格格不入。

我的问题是,我觉得实体服务(entity services)无法与DDD很好配合,尽管你暴露那些服务只是为了聚合,但因为你的领域设计需要改变,而且你已经丧失了“跨聚合事务”这样的基本特 性,所以你还是会遇到问题。没错,你可以在某些方面放松一些,但你要是那样做了,你还能享受SOA带来的好处吗?

Casey Charlton赞同Ashley Fernandes的观点,他认为Tomas和Colin的方法会导致大量细粒度服务的出现:

我想,你最好暴露封装了整个领域模型的大粒度服务,然后在这些服务之间进行消息传递,而不是在较低的层次上对SOA进行分解。严格照此行事才算得上是SOA。进一步细化,会违反“粗粒度服务”的原则。CRUD操作在SOA架构里肯定是无用的。

Casey Charlton的观点得到了Andreas Ohlund的支持,他引述Bill Poole的话说:“DDD是用于在粗粒度的SOA服务里构建领域逻辑的”。

没错,SOA和DDD支持同样的目标。良好设计的服务指的是那些“名字为CEO或业务总管所熟悉的、并且后者关心其具体功能的”服务。而良好设计的领域对象(well designed domain objects)定义的是一组基础对象,它们用于语义数据模型、构建服务、以及在它们之间传递信息

查看英文原文:Is There a Symbiosis Between SOA and DDD?

没有回复

回复

独家内容

应用JSF、Ajax和Seam开发Portlets(1/3)

本文主要讲述了如何用JBoss Portlet Container 和JBoss Portlet Bridge创建新项目,怎样配置一个JSF应用去使用JBoss Portlet Bridge,以及JBoss Portlet Bridge所具备的功能。

AtomServer:数据分发的发布动力(第二部分)

在这篇文章里,Bryon Jacob和Chris Berry将和我们继续探讨AtomServer,它是基于Apache Abdera的完整Atom存储实现。作者还创建了几个Atompub规范扩展,其中包括自动标记、批处理和Feeds聚合。

架构师(试刊第二期)

InfoQ中文站的电子杂志《架构师》试刊第二期出版了!相比于上期,我们在内容的选择安排和版式上都根据读者的意见重新做了修正。“细节决定成败”,我们希望基于InfoQ中文站的专业内容,《架构师》能逐渐成为大家喜欢的电子刊物!

一种正规的性能调优方法:基于等待的调优

在本文中,Steven Haines探讨了Web应用性能调优问题。该领域过去更像是一门艺术而不是一门科学。他提出了一种称为基于等待调优的方法,使整个调优过程更加可度量,也因此更具科学性。

Java程序员ActionScript 3入门

通常来说,改变技术路线时最艰难的部分是辨别语言语法之间的不同。这篇文章就为Java开发者提供了一份如何转向Flex基础语言ActionScript的指南。

浅谈如何创建Rails应用

本视频主要以财帮子为例,介绍了如何创建一个PV为百万级的Rails应用。其中包括:Rails应用的服务器架构、Rails Cache的优化、负载均衡的处理、Web服务器的调试、分布式解决方案、Open API的设计等等。

Alexandru Popescu谈InfoQ.com网站架构

InfoQ首席架构师Alexandru Popescu在采访中谈论了InfoQ架构、Webwork与DWR、Hibernate与JCR、Hibernate可扩展性、最新的InfoQ视频流系统和InfoQ的未来规划。

揭示常见的重构误区

相对于Java,.NET在持续重构方面所给与的重视仍然少为人知,大多数人对于重构是否真正属于开发过程,以及如何将其应用到开发过程中持观望态度。Danijel Arsenovski试图为你揭示这些谜题。