关于frameworks:MASA-Framework-DDD设计2

Clean Architecture国内对于Clean Architecture的翻译很多,洁净/整洁/清晰。但无论哪一种都阐明了它简洁、清晰的个性。 晚期它长这样 看到这张图的同学可能会对另外一张图有印象 洋葱架构(Onion) 当初长这样 看起来如同是亲戚,它们确实也有着千头万绪的关系 剖析Clean Architecture这部分次要是依据explicit architecture文章的了解整顿的,有翻译也有本人理解消化的。如有错漏欢送斧正,谢谢三大构建块用户界面基础设施利用外围 控制流用户界面利用外围基础设施利用外围用户界面 工具左右两侧造成鲜明对比,动机不同 HTTP/CLI:通知利用要做什么SMS/Mailing Server/Search Engine...:利用通知它们要做什么 链接工具和交付机制到利用外围将工具连贯到应用程序外围的代码单元称为适配器(端口和适配器架构)。 通知咱们的应用程序做某事的适配器称为主适配器或被动适配器,而咱们的应用程序通知咱们做某事的适配器称为从适配器或被动适配器。 端口这些适配器为了适应利用外围的一个十分特定的入口点,即端口。端口只不过是工具如何应用应用程序外围或利用外围如何应用它的标准。 你能够看作是接口和DTO主适配器或被动适配器主适配器或被动适配器围绕一个端口并应用它来通知利用外围该做什么。 咱们的被动适配器是Controller或Console Commands,它们在其构造函数中注入了一些对象,该对象的类实现了Controller或Console Commands所需的接口(端口)。 端口能够是控制器须要的服务接口或存储库接口,而后将 Service、Repository 或 Query 的具体实现注入并在 Controller 中应用。 或者,端口能够是Command Bus或Query Bus的接口。在这种状况下,将Command Bus或Query Bus的具体实现注入到Controller中,而后Controller结构Command或Query并将其传递给相干Bus。 注:这里其实提到了CQRS 从适配器或被动适配器与围绕在端口四周的被动适配器不同,从适配器实现一个端口、一个接口,而后在须要端口的任何中央注入利用外围。 能够了解为是右侧是合乎利用外围的须要的接口或者对象,而左侧则是包装用例的传播机制,如HTTP/CLI等 假如咱们有一个须要长久化数据的需要: 咱们创立一个长久化接口(在左侧端口四周),有一个保留数据的办法和一个通过ID删除数据的办法基础设施中提供一个实现类,通过IoC注入这个接口和对应的实现类在须要长久化数据的类的构造函数中注入一个长久化接口如果有一天咱们须要从SQL Server换到MongoDb,只须要替换步骤2中的实现类和注入新的实现类即可IoC与上图相比,仅仅是多了一个蓝色的箭头从内部直插入利用外围外部。在下面例子中有提到通过IoC的作用这里就不再反复了。 至此,咱们统一在解说利用外围的外围,而利用外围是咱们架构设计的重点。 利用外围组织洋葱架构采纳 DDD 分层并将它们合并到端口和适配器架构中。这些层旨在为业务逻辑带来一些组织,即端口和适配器“六边形”的外部,就像在端口和适配器中一样,依赖方向是朝向核心的。 应用层用例(Use Case)是咱们的利用中的一个或多个用户界面触发的流程(业务逻辑)。用户界面能够是终端用户界面也能够是治理界面,或者控制台界面和API。 用例在应用层定义,由DDD和洋葱架构提供,它能够蕴含端口,ORM接口,搜索引擎接口,音讯接口等,也能够是CQRS解决Handlers的中央,发送邮件,调用第三方API等。 应用服务/Command Handler蕴含用例的业务逻辑,作用是: 应用Repository查找一个或多个实体通知这些实体做一些畛域逻辑应用Repository长久化这些实体,保留数据更改Command Handler能够有两种不同的应用形式: 蕴含执行用例的实在业务逻辑作为架构中的中间件,接管Command并触发应用服务中的逻辑 畛域层畛域内的对象除了有对象自身的属性外,还能够操作该对象外部的属性,这是特定于域自身的,并且独立于触发该逻辑的业务流程,它们是独立的,齐全不晓得应用层。 畛域服务有时咱们会遇到一些波及不同实体的畛域逻辑,无论是否雷同,该畛域逻辑不属于实体自身,它没有间接责任。 那咱们能够应用畛域服务来承载这部分逻辑,可能有人会感觉那能够放应用层,但畛域逻辑在其余用例中就不能重用了。畛域逻辑应该在畛域外部,不要回升到应用层。 畛域服务能够应用其余畛域服务,或者其余畛域对象畛域模型在最核心,依赖于它之外的任何货色,是畛域模型,它蕴含代表畛域中某些事物的业务对象。至于如何定义畛域模型能够参考第一篇。 组件组件与利用外围内所有的层穿插,从外贯通到外部。例如身份验证、受权、计费、用户、评论或账户,但它们仍然与畛域无关。 像受权和身份验证这样的限界上下文应该被视为暗藏在某种端口前面的内部工具。 解耦组件具备齐全解耦的组件意味着一个组件不间接理解任何另一个组件。换句话说,它可能没有接口,所以咱们须要一些新的架构构造。 比方事件、最终一致性、服务发现等。当你往这条路上走的时候,你就开始脱离单体了。 这里Dapr或者是个不错的抉择,它蕴含了这些性能,对Dapr感兴趣的能够看之前的手把手教你学Dapr系列MASA Framework解决方案联合DDD和Clean Architecture以及MASA Framework的个性,咱们将在MASA.BuildingBlocks中以接口的模式定义标准,在MASA.Contrib中对接口进行实现。 ...

February 23, 2022 · 1 min · jiezi