Domain driven design 存储库查找器方法应该承担哪些职责? TL;博士
DDD存储库应:Domain driven design 存储库查找器方法应该承担哪些职责? TL;博士,domain-driven-design,Domain Driven Design,DDD存储库应: 是否执行域服务稍后细化的通用搜索 findAllByPurchaseId(purchaseId) 或者是针对特定用例定制的详细搜索 findallofpurchasedubefore(purchaseId,limitDate) 做额外的简单计算(如求和) purchaseId,limitDate之前的预期目标数量 问题的背景 我的域模型有两个聚合: 购买(purchaseId) 分期付款(采购ID、到期日、金额) 在我的一个应用程序服务中,我必须回答关于在某个日
- 是否执行域服务稍后细化的通用搜索
findAllByPurchaseId(purchaseId)
- 或者是针对特定用例定制的详细搜索
findallofpurchasedubefore(purchaseId,limitDate)
- 做额外的简单计算(如求和)
purchaseId,limitDate之前的预期目标数量
问题的背景
我的域模型有两个聚合:
购买(purchaseId)
分期付款(采购ID、到期日、金额)
在我的一个应用程序服务中,我必须回答关于在某个日期之前预期支付的分期付款总额的问题
初始InstallmentRepository
实现(Groovy+Grails+GORM+Hibernate):
def findAllByPurchaseId(purchaseId){
分期付款执行(
'来自purchaseId=:purchaseId'的分期付款,
[purchaseId:purchaseId]
)
}
应用程序服务进行了进一步的筛选和计算:
def amountExpectedToBePaidBefore(purchaseId,limitDate){
def installments=installmentRepository.findAllByPurchaseId(purchaseId)。
findAll{it.duefore limitDate}
分期付款*.amount.sum()
}
我意识到我的应用程序服务有域逻辑——它进行额外的过滤和计算。另一方面,我的存储库似乎太道地了——它只进行简单的聚合访问,没有任何额外的业务价值
我考虑<强>两个重构选项< /强>:
将筛选依据dueDate
放在存储库中,并将金额总和放在域服务中
在存储库中执行所有操作(金额总和是一个简单的计算)
由于存储库应该模仿专门的聚合集合,API基于普遍存在的语言,因此选项2.对我更具吸引力
DDD存储库应该具有哪个抽象/详细级别?
- 它是否应该执行可能被许多服务使用的通用搜索
- 存储库查找程序是否应该/可以是特定于应用程序服务/用例的
- 在存储库中进行额外(尽管很简单)计算可以吗
否。域存储库查询通常是GetById()。这不是一个硬性规定,但这是域名需要99%的时间。不要重复使用域存储库界面进行演示/报告查询。也就是说,具体类可以处理所有事情,但是抽象应该根据上下文需要进行定制
如果域需要“是”,则repository方法将获得一个要使用的条件
如果处理不需要业务规则,那么就可以了。然而,这并不是一个真正的存储库语义,这是一个碰巧在DAL中实现的服务。所以是的,但不要称之为存储库:)
我和我的团队得出了同样的结论。