对于聚合来讲,资源库的作用是负责将聚合持久化到数据库的(通常是持久化到数据库),并且由于聚合根负责维持聚合的生命周期,也就使得应考虑仅聚合根才应该拥有资源库,这也是与 DAO 层不同的地方。
在分层设计时,考虑将资源库的抽象划分到领域层,属于领域模型对象的一部分,如同设计防腐层的抽象网关般,资源库的抽象作为特殊的网关,当在应用层或是领域层中操作资源库抽象时,将资源库作为管理聚合状态的工具,可以忽视基础设施层中对资源库的具体实现。而在考虑基础设施层中具体实现时,可根据需要选择适合的工具,以此来管理和操作资源。
工厂聚合从 0 到 1 的过程,可以通过多种途径创建,一般来讲,我们开发中常直接实例化或是反射实例化,而对于聚合来讲,整个聚合是一个整体,命运共同体,并且由聚合根掌握聚合的生命周期。通常,我们可以借助几种方式来创建聚合,组装聚合,在创建过程中封装业务逻辑。
聚合自身担任工厂,在聚合根中实现 Factory 方法
独立的 Factory 类,用于有一定复杂度的创建过程,或者创建逻辑不适合放在聚合根上
借助其他聚合来创建,其他聚合担任工厂角色
借助构建者模式灵活组装聚合
聚合根的创建有多种方式,依据聚合内掌握知识的多少与创建逻辑的需要可灵活选择。
//... var partType= PartType.Create(input.Name, input.Description) .SetCategory(input.Category) .SetFactory(input.FactoryName);如借助构建者模式,通过拆分许多小的方法,将过多的参数拆分,以此避免一个创建方法参数中满屏都是参数的情况,需要考虑吧拆分的方法需要满足业务一致性,如内部的一些属性间有约束条件下,需要划分到一个方法中,以维持一致性或不变性。
学无止境从2004年领域驱动设计到现在已经有17年时间了,并且在其中还有诸如六边形架构,洋葱架构,整洁架构等的出现,考虑的侧重点不同,衍生着大量的新概念,也不断地完善着领域驱动设计的思想。在学习与理解领域驱动设计中,总会有新的东西改变我们以往的思想,见到的越多,越发觉认识的越少,这或许也是学起来有点阻力的原因吧。
参考《实现领域驱动设计》- Vaughn Verno
《领域驱动设计实践》- 张逸
《软件架构编年史》- herbertograca
领域驱动设计实现之路 - 滕云
领域驱动设计编码实践 - 滕云
Package by component and architecturally-aligned testing - Simon
2021-01-18,望技术有成后能回来看见自己的脚步