领域驱动设计中的层
Layers in Domain Driven Design
在领域驱动设计中,据说领域层不依赖于其他层,即存储库接口在领域层内,而其实现在基础设施层。
但是,限界上下文(具有域 + 基础设施)作为一个单元部署(可部署),因此这些层实际上是 逻辑 而不是 物理。那么在域和基础设施层之间绘制这个虚拟分隔符有什么好处?
更新
在传统的分层方法中,域(服务)被认为依赖于基础设施层。相反,当涉及到 DDD / Clean / Hexagonal 架构时,领域独立于其他层,因为领域层有一个由基础设施层实现的接口。
无论您使用 DDD 还是传统的分层方法,您仍然必须模拟存储库,这意味着域实际上并不是独立的。这是正确的吗?
Domain Model pattern 背后的假设是域模型是应用程序最复杂的部分,或者变化更多的部分比其他部分频繁
领域模型模式试图通过使领域模型独立于其他问题来解决这个问题。这样做的好处之一是您可以 单元测试 域模型以隔离其依赖项。您还可以改变域模型而无需更改应用程序的其他部分。
这些是主要优点,但也有缺点。解耦会使代码库更难导航,而且往往需要在层之间进行大量映射。是否 this is worthwhile 取决于具体情况(领域模型有多复杂,您还有哪些其他验证方案等)
最大的驱动力是允许不同层在不影响彼此的情况下进行更改。例如,我经常独立于基础设施层测试领域层。我通过模拟我的 DAO 和存储库来做到这一点,这使我的测试 运行 快得多,并使它们变得不那么脆弱。
当我的存储库最终需要一个新的实现时,我也使用过它(Oracle vs MS SQL vs Web Service)。当后端服务发生变化时您不必重写整个应用程序,它会大大降低您的复杂性。
最后,拆分这有助于您完成 SRP。将你的数据库层集成到你的域层中往往会让你跳过这个(至少根据我的经验)。它不会强迫您这样做,但肯定会鼓励不良行为。
这与我们不在 UI 中编写领域逻辑的原因相同。对于任何足够小的例子,这是浪费时间。只有当您拥有大型复杂的应用程序时,它的价值才会显现出来。
在领域驱动设计中,据说领域层不依赖于其他层,即存储库接口在领域层内,而其实现在基础设施层。
但是,限界上下文(具有域 + 基础设施)作为一个单元部署(可部署),因此这些层实际上是 逻辑 而不是 物理。那么在域和基础设施层之间绘制这个虚拟分隔符有什么好处?
更新
在传统的分层方法中,域(服务)被认为依赖于基础设施层。相反,当涉及到 DDD / Clean / Hexagonal 架构时,领域独立于其他层,因为领域层有一个由基础设施层实现的接口。
无论您使用 DDD 还是传统的分层方法,您仍然必须模拟存储库,这意味着域实际上并不是独立的。这是正确的吗?
Domain Model pattern 背后的假设是域模型是应用程序最复杂的部分,或者变化更多的部分比其他部分频繁
领域模型模式试图通过使领域模型独立于其他问题来解决这个问题。这样做的好处之一是您可以 单元测试 域模型以隔离其依赖项。您还可以改变域模型而无需更改应用程序的其他部分。
这些是主要优点,但也有缺点。解耦会使代码库更难导航,而且往往需要在层之间进行大量映射。是否 this is worthwhile 取决于具体情况(领域模型有多复杂,您还有哪些其他验证方案等)
最大的驱动力是允许不同层在不影响彼此的情况下进行更改。例如,我经常独立于基础设施层测试领域层。我通过模拟我的 DAO 和存储库来做到这一点,这使我的测试 运行 快得多,并使它们变得不那么脆弱。
当我的存储库最终需要一个新的实现时,我也使用过它(Oracle vs MS SQL vs Web Service)。当后端服务发生变化时您不必重写整个应用程序,它会大大降低您的复杂性。
最后,拆分这有助于您完成 SRP。将你的数据库层集成到你的域层中往往会让你跳过这个(至少根据我的经验)。它不会强迫您这样做,但肯定会鼓励不良行为。
这与我们不在 UI 中编写领域逻辑的原因相同。对于任何足够小的例子,这是浪费时间。只有当您拥有大型复杂的应用程序时,它的价值才会显现出来。