DDD和“洋葱架构”是啥关系?
Posted
技术标签:
【中文标题】DDD和“洋葱架构”是啥关系?【英文标题】:What is the relationship between DDD and the “Onion Architecture”?DDD和“洋葱架构”是什么关系? 【发布时间】:2011-03-24 21:30:45 【问题描述】:Domain-driven design(DDD) 和 Jeffrey Palermo 的“The Onion Architecture”是什么关系?
【问题讨论】:
【参考方案1】:在我看来——它们是相辅相成的——但是从非常不同的角度来看。
洋葱架构旨在使域/业务逻辑独立于“劣质”事物,例如数据访问、用户界面、服务等。洋葱架构并不真正关心您如何创建您拥有的域 - 它坚持保护它来自外部依赖项。
领域驱动设计就是关于如何为领域建模以及如何称呼您的对象。这意味着每个域类应该与它在它所处理的业务域中所代表的内容(即物理/现实世界)有直接关系。因此,客户对象应该在代码中命名为客户——它应该与现实世界中的客户具有相同的规则(或尽可能接近)。
【讨论】:
【参考方案2】:我认为两者在系统本身的“您的设计方式和您的整体理念是什么”方面彼此不同。
使用洋葱架构,全世界都围绕着您的数据存储。这意味着您不关心您如何“完成工作”,但您更关心“我希望完成工作”。显然,最佳实践(小方法、好的变量名,也许像 Sigleton 等一些设计模式)在这个范围内仍然有意义,但更多的是代码本身,而不是整个应用程序概述。
另一方面,当我们谈论 DDD 时,我们谈论的是业务,当我们对架构做出决定时,我们总是会想到要解决的业务模型。当我说决策时,我的意思是系统可能拥有的决策总数(从变量/类/函数名称,到我们放置部分代码的位置,以及在一天结束时我们如何谈论这个系统本身)。我们可以说 DDD 是业务模型的“编程抽象”)。但是当然我们不能在没有业务的情况下制作 DDD e.x 我们不能在像 Shazam 这样的程序上制作 DDD,但我们可以在 Facebook 或 Spotify 这样的程序上制作 DDD。
我的选择是你们不能相互混合,而是这是第一个决定。
【讨论】:
【参考方案3】:如果您查看您提供的链接中描述洋葱架构的图像,域模型层就是 DDD 所关注的。
洋葱是系统的架构模式,而 DDD 是一种设计系统中对象子集的方法。两者可以彼此独立存在,因此两者都不是另一个的子集。如果您将它们一起使用 - 那么作为一个整体,使用 DDD 设计的部分将是整个系统的子集。
用一个(可能不好的)类比:洋葱是设计房屋的一种模式,而 DDD 是一种铣削房屋一部分木材的方法。
【讨论】:
我认为如果我们将所有“DDD”替换为“DM”(域驱动设计,范式,它可能驱动整个微服务架构 - 到域),他的推理看起来会更好一些模型,DDD 的战术工具集,仅用于更复杂的有界上下文或微服务的业务逻辑。以上是关于DDD和“洋葱架构”是啥关系?的主要内容,如果未能解决你的问题,请参考以下文章
DDD系列 - 第0讲 DDD中常提到的应用架构总结(六边形洋葱整洁清晰)
OnionArch 2.0 - 基于DDD的洋葱架构改进版开源