architecture - 领域驱动设计中的层

标签 architecture domain-driven-design inversion-of-control 3-tier decoupling

在领域驱动设计中,领域层被称为不依赖于其他层,即存储库接口(interface)在领域层内,而它的实现在基础设施层。
但是,有界上下文(具有域 + 基础设施)被部署为一个单元(可部署),因此这些层实际上是逻辑层而不是物理层。那么在域和基础设施层之间绘制这个虚拟分隔符有什么好处呢?
更新
在传统的分层方法中,域(服务)被称为依赖于基础设施层。相反,当涉及到 DDD/Clean/Hexagonal 架构时,域独立于其他层,因为域层具有由基础设施层实现的接口(interface)。
无论您使用 DDD 还是传统的分层方法,您仍然必须模拟存储库,这意味着域实际上并不是独立的。它是否正确?

最佳答案

最大的驱动力是允许不同的层在不相互影响的情况下改变。例如,我经常独立于基础设施层测试我的领域层。我通过模拟我的 DAO 和存储库来做到这一点,这可以让我的测试运行得更快,并使它们变得不那么脆弱。

当我的存储库最终需要一个新的实现(Oracle vs MS SQL vs Web Service)时,我也使用过它。当后端服务发生变化时,您不必重写整个应用程序,它大大降低了您的复杂性。

最后,拆分这有助于您完成SRP .将您的数据库层集成到您的域层往往允许您跳过这一点(至少根据我的经验)。它不会强制你这样做,但它肯定会鼓励不良行为。

这与我们不在 UI 中编写域逻辑的原因相同。对于任何足够小的例子,这都是浪费时间。只有当您拥有大型、复杂的应用程序时,它的值(value)才会显现出来。

关于architecture - 领域驱动设计中的层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32614681/

相关文章:

deployment - 如何使用 bit torrent 部署到服务器?

domain-driven-design - DDD/CQRS : Combining read models for UI requirements

c# - Ninject 字段注入(inject)在构造函数类中不起作用

c# - 如何在不引用程序集(或其中的类型)的情况下使用 Ninject 约定扩展

java - 如何实现应用程序故障转移?

javascript - 如何将手动部署的单实例应用程序重构为客户端部署的多实例或 Multi-Tenancy 应用程序

java - DDD Java with Spring - Repository 返回 Mono/Flux

.net - Funq IoC Container 是否支持属性注入(inject)?

web-services - 如何跟上SOA的步伐?

jpa - 如何在 DDD 中实现 Vaughn Vernon 关于聚合中引用的建议