Domain driven design 存储库查找器方法应该承担哪些职责? TL;博士

Domain driven design 存储库查找器方法应该承担哪些职责? TL;博士,domain-driven-design,Domain Driven Design,DDD存储库应: 是否执行域服务稍后细化的通用搜索 findAllByPurchaseId(purchaseId) 或者是针对特定用例定制的详细搜索 findallofpurchasedubefore(purchaseId,limitDate) 做额外的简单计算(如求和) purchaseId,limitDate之前的预期目标数量 问题的背景 我的域模型有两个聚合: 购买(purchaseId) 分期付款(采购ID、到期日、金额) 在我的一个应用程序服务中,我必须回答关于在某个日

DDD存储库应:

  • 是否执行域服务稍后细化的通用搜索
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中实现的服务。所以是的,但不要称之为存储库:)


  • 我和我的团队得出了同样的结论。