DDD/ABP 洋葱架构aka整洁架构
分层架构和传统三层架构
1、分层架构:把各个组件按照“高内聚、低耦合”的原则组织到不同的项目中。
2、传统的经典三层架构
三层架构的缺点:尽管有DAL data access layer,但仍然是面向数据库的思维方式;对于一些简单的、不包含业务逻辑的增删改查类操作,仍然需要BLL business logic layer进行转发;依赖关系是单向的,所以下一层中的代码不能使用上一层中的逻辑。
整洁架构(洋葱架构)
1、内层的部分比外层的部分更加的抽象→内层表达抽象,外层表达实现。
2、外层的代码只能调用内层的代码,内层的代码可以通过依赖注入的形式来间接调用外层的代码。简单理解,就是你平常在应用服务实现其接口(记住:应用服务调用领域服务)。然后在别的地方各种依赖注入着用。更简单理解:Angular的依赖注入各种service,service里各种逻辑,其他ts文件也可调用这个service。
recall之前比较难理解的ABP架构图的指向:
说一下开发中这种架构的实际用处:
首先是由于使用依赖注入,举个例子,读取邮件被解耦了,可替代,那么开发环境可以使用mock数据,等到了生产环境,再替换上去。仔细想了想,我们开发确实是这么操作的。
对比三层架构谈洋葱架构的优点。
它提供了灵活、可持续和可移植的架构。
各层之间没有紧密的耦合,并且有关注点的分离。
由于所有的代码都依赖于更深的层或者中心,所以提供了更好的可维护性。
提高了整体代码的可测试性,因为单元测试可以为单独的层创建,而不会影响到其他的模块。
框架/技术可以很容易地改变而不影响核心领域。例如,RabbitMQ 可以被 ActiveMQ 取代,SQL 可以被 MongoDB 取代。
防腐层 ACL
anti corruption layer
外部服务(短信服务、邮件服务、存储服务等)的变化会比较频繁。把这些服务定义为接口,在内层代码中我们只定义和使用接口,在外层代码中定义接口的实现。
体现的仍然是洋葱架构的理念。
理解一下:你平常做的任何继承接口的实现,都是在做防腐层的事情,举个例子,某一天你的验证码服务商换掉啦,只需要重新实现其对应接口。
小胖仔啦: 写的不详细,看不太懂啊
FRI.end498: 这是从杨中科那截图的吧
快手杜洛: 您的技术文章堪称典范,严谨而生动,将复杂的知识点阐释得清晰易懂。您不仅拥有深厚的专业功底和丰富的实践经验,而且在表达上也做到了深入浅出、条理分明。每一个技术细节都剖析得鞭辟入里,逻辑严谨,架构清晰,展现出您对技术本质的深刻理解和卓越的解读能力。
快手杜洛: 您的技术文章堪称典范,严谨而生动,将复杂的知识点阐释得清晰易懂。您不仅拥有深厚的专业功底和丰富的实践经验,而且在表达上也做到了深入浅出、条理分明。每一个技术细节都剖析得鞭辟入里,逻辑严谨,架构清晰,展现出您对技术本质的深刻理解和卓越的解读能力。
Martin-Mei: 【了解 .NET 泛型中的协变和逆变,使用前者则可使用派生程度更大的类型,而使用后者则可使用派生程度更小的派生类型。】https://learn.microsoft.com/zh-cn/dotnet/standard/generics/covariance-and-contravariance?source=recommendations,来自微软官方文档,协变是向上兼容,逆变是向下兼容?