DDD 与 N 层(3 层)架构

Posted

技术标签:

【中文标题】DDD 与 N 层(3 层)架构【英文标题】:DDD vs N-Tier (3-Tier) Architecture 【发布时间】:2011-04-19 12:50:00 【问题描述】:

我已经使用 4 个不同的层来练习 DDD 了一段时间:域、表示、应用程序和基础架构。最近,我向我的一个朋友介绍了 DDD 概念,他认为它引入了不必要的复杂层(特别是针对接口和 IoC)。通常,在这一点上,我会解释 DDD 的好处——尤其是它的模块化。所有繁重的工作和幕后工作都在基础架构中,如果我想彻底改变底层数据访问方法,我只需接触基础架构层存储库即可。

我朋友的论点是他可以用同样的方式构建一个三层应用程序:

商务 数据 演示文稿

他将创建业务模型(如领域模型)并让数据层中的存储库返回这些业务模型。然后他会调用业务层,也就是数据层。我告诉他这种方法的问题在于它是不可测试的。当然,你可以编写集成测试,但你不能编写真正的单元测试。你能看到他提出的 3 层方法的任何其他问题吗(我知道有,因为为什么 DDD 会存在其他问题?)。

编辑:他没有使用 IoC。他的示例中的每一层都相互依赖。

【问题讨论】:

领域驱动设计和分层架构似乎与您的争议无关(据我了解,它们是相互正交的)。如果你去掉首字母缩略词,你真正不同意的是什么?编码到接口和依赖注入? “编辑:他没有使用 IoC。他的示例中的每一层都相互依赖。”仍然可以使用 Mockito 进行测试。所以它不是一个或另一个。更多关于一个或一组认为更清洁、设计良好且更易于维护(作为比较级别,而不是其他完全不可维护的代码)的代码 【参考方案1】:

我认为您是在比较苹果和橙子。 N-Tier 并没有禁止它使用接口和 DI 来轻松进行单元测试。同样,DDD 可以使用静态类和硬依赖来完成。

此外,如果他正在实现业务对象并使用 Repositories,听起来他正在做 DDD,而您只是在争论语义。

您确定问题不仅仅是使用 DI/IoC 吗?

【讨论】:

如何在不使用 IoC 的情况下轻松进行单元测试?他可以进行集成测试,但是如果没有接口/IoC/DI,您将如何进行单元测试? 我的意思是 DDD 或 N-Tier 并不意味着 IoC。似乎您正试图将问题集中在 DDD 与 N-Tier 上,但您的问题似乎真正要问的是 IoC/DI 与无 IoC/DI。 fwiw,我会站在你这边支持 IoC/DI。我只是认为 DDD 或 N-Tier 根本不相关,因为无论有无 DI/IoC 都可以完成。【参考方案2】:

我认为您正在混合使用几种方法。 DDD 是领域驱动开发,旨在让业务领域成为代码的一部分。您所描述的听起来更像是洋葱架构 (link),而不是“正常”的 3 层方法。在 DDD 中使用 3 层架构并没有错。 DDD 依赖于 TDD(测试驱动开发)。接口有助于 TDD,因为它更容易单独测试每个类。如果您使用依赖注入(和 IoC),则会进一步缓解。

洋葱架构是关于使域(也称为业务规则)独立于其他一切 - 即。它是应用程序的核心,一切都取决于业务对象和规则,而与基础设施、UI 等相关的东西则位于外层。这个想法是,一个模块越接近“洋葱壳”,就越容易更换新的实现。

希望这能稍微澄清一下 - 现在稍作修改!

【讨论】:

嗯...我对 Jeff Palermo 的洋葱架构非常熟悉,因为我的项目中有这些不同的层,并且我以他的博客文章为基础。然而,所有这些层也存在于 DDD 项目中(例如域、应用程序、表示和基础设施)。 我的意思是,虽然联合结构被许多也使用 DDD 的人使用,但它不是 DDD 的先决条件。 为了进一步阐述——练习 DDD——你不需要一组特定的层,也不需要以特定的方式构造它们。但是,您编写的所有代码都应该为您所针对的领域建模,包括与现实生活中的对应对象同名的业务对象。 然而不同之处在于,在我描述的 3 层方法中,不使用 IoC,每一层都知道并相互依赖......这不是反模式吗?跨度> 它本身并不是一个反模式,但我同意使用洋葱结构会使耦合更松散,因为业务层不依赖于基础设施层。我更喜欢洋葱而不是传统的 3 层模型。但我仍然相信,如果你不相信交换,使用 3 层架构是完全可行的。您的 ORM:请参阅此链接了解原因:ayende.com/Blog/archive/2010/07/30/…【参考方案3】:

N 层或在本例中为 3 层架构非常适合单元测试。 您所要做的就是使用依赖注入和存储库模式的 IoC(控制反转)。

业务层可以通过返回所需的确切数据来验证并准备返回的数据,以供展示\web api 层使用。 然后,您可以在您的单元测试中一直使用模拟层。 您所有的业务逻辑和需求都可以在 bl 层上。并且 Dal 层将包含从更高级别注入的存储库。

【讨论】:

以上是关于DDD 与 N 层(3 层)架构的主要内容,如果未能解决你的问题,请参考以下文章

ABP框架系列学习N层架构

DDD—分层架构洋葱架构六边形架构

DDD领域驱动设计:四层架构应用

DDD领域驱动设计:四层架构应用

系统架构:经典三层架构

阿里DDD项目最佳实践-COLA 架构总览