// 应用层的用例
public void cancelOrder(Long orderId) {
Order order = orderRepository.findById(orderId);
// 领域层的业务逻辑
order.cancel()
orderRepository.save(order);
}
资源依赖倒置(或依赖反转)原则(Dependency inversion principle,DIP),由Bob大叔提出,其定义如下:
高层模块不应该依赖于低层模块,两者都应该依赖于抽象。 抽象不应该依赖于细节,细节应该依赖于抽象。
我们把资源库接口实现放在基础设施层,让基础设施层向上依赖领域层。虽然这样违背了分层架构原则,但是却符合依赖倒置原则:领域层(高层模块)不依赖基础设施层(低层模块),两者都依赖于资源库接口(抽象)。采用了依赖倒置后,同时调整下基础设施层位置,此时分层架构如下图:
分层架构采用依赖倒置原则后,实际上已经不存在分层的概念了。无论是高层还是低层,都只依赖于抽象,好像把整个分层架构给推平了一样。推平后的分层架构如下图:
给推平的分层架构补上左侧对称的另一半,其结果就类似六边形架构,如下图是六边形架构。
整洁架构是Bob大叔在其《架构整洁之道》一书中,对六边形架构和其他类似架构做了总结和抽象之后,提出的一种架构设计理念。
独立于框架:这些系统的架构并不依赖某个功能丰富的框架之中的某个函数。框架可以被当成工具来使用,但不需要让系统来适应框架。 可被测试:这些系统的业务逻辑可以脱离UI、数据库、Web服务以及其他的外部元素来进行测试。
独立于UI:这些系统的UI变更起来很容易,不需要修改其他的系统部分。
独立于数据库:我们可以轻易将这些系统使用的Oracle、SQL Server替换成Mongo、BigTable、CouchDB之类的数据库。因为业务逻辑与数据库之间已经完成了解耦。
独立于任何外部机构:这些系统的业务逻辑并不需要知道任何其他外部接口的存在。
综合以上所有架构的设计理念,Bob大叔提出了整洁架构设计理念,如下图。
以上图中同心圆分别代表了软件系统的不同层次,通常越靠近中心,其所在的软件层次就越高。
采用依赖倒置原则后的分层架构和六边形架构,实际上都符合整洁架构设计理念。但是六边形架构中使用端口与适配器,让应用程序能够以一致的方式被用户、程序、自动化测试、批处理脚本所驱动,同时能够让应用程序边界更加清晰,从而能更好地防止领域层和应用层逻辑泄露到外层。
1. 《实现领域驱动设计》
本文仅供学习!所有权归属原作者。侵删!文章来源: 京东零售技术 -同城研发 加文雄 :http://mp.weixin.qq.com/s/61Ppm-MEdFrc7qrC2z_cKA
文章评论