Fah*_*ook 7 architecture domain-driven-design 3-tier inversion-of-control decoupling
在域驱动设计中,域层据说不依赖于其他层,即存储库接口位于域层内,而其实现位于基础架构层.
然而,有界上下文(带域+ infra)被部署为一个单元(可部署),因此这些层实际上是逻辑的而不是物理的.那么在域和基础架构层之间绘制这个虚拟分隔符有什么好处?
更新
在传统的分层方法中,域(服务)被认为依赖于基础设施层.相反,当涉及DDD /清洁/六边形体系结构时,域独立于其他层,因为域层具有由基础结构层实现的接口.
无论您使用DDD还是传统的分层方法,您仍然需要模拟存储库,这意味着域实际上并不是独立的.它是否正确?
域模型模式背后的假设是域模型是应用程序中最复杂的部分,或者是比其他部分更频繁更改的部分.
域模型模式试图通过使域模型独立于其他问题来解决这一问题.这样做的一个优点是,您可以单独测试域模型,而不依赖于它的依赖关系.您还可以更改域模型,而无需更改应用程序的其他部分.
这些是主要优点,但也有缺点.解耦可能会使代码库难以导航,并且还往往需要在层之间进行大量映射.无论这是值得取决于具体的情况(是多么复杂的领域模型,其他验证方案你有什么,等等)
小智 6
最大的驱动力是允许不同的层更改而不会相互影响.例如,我经常独立于我的基础架构层测试我的域层.我通过模拟我的DAO和存储库来做到这一点,这使我的测试运行得更快,并使它们更不易碎.
当我的存储库最终需要一个新的实现(Oracle vs MS SQL vs Web Service)时,我也使用过它.当后端服务从您的下方更改时,您不必重写整个应用程序,从而大大降低了复杂性.
最后,拆分这有助于您完成SRP.将数据库层集成到域层中往往允许您跳过此(至少根据我的经验).它不会强迫你,但它肯定会鼓励不良行为.
这与我们不在UI中编写域逻辑的原因相同.对于任何足够小的例子,这是浪费时间.只有拥有庞大而复杂的应用程序时,它的价值才会变得明显.