Domain driven design DDD:大型聚合根用户

Domain driven design DDD:大型聚合根用户,domain-driven-design,aggregateroot,Domain Driven Design,Aggregateroot,我正在建立一个系统来管理个人信息。我有一个不断增长的聚合根叫做Person。它现在有数百个相关对象、名称、地址、技能、缺勤等。我担心的是,AR人员正在破坏SRP,并且随着越来越多的东西(esp集合)添加到其中,会产生性能问题 我不知道如何使用DDD将其分解为更小的对象。以缺勤为例。此人有一系列缺勤记录(开始日期、结束日期、原因)。这些当前通过人员进行管理(记账缺勤、变更缺勤、取消缺勤)。当添加缺勤时,我需要对照所有其他缺勤进行验证,因此我需要一个可以访问其他缺勤的对象来执行此验证 我是不是遗漏了

我正在建立一个系统来管理个人信息。我有一个不断增长的聚合根叫做Person。它现在有数百个相关对象、名称、地址、技能、缺勤等。我担心的是,AR人员正在破坏SRP,并且随着越来越多的东西(esp集合)添加到其中,会产生性能问题

我不知道如何使用DDD将其分解为更小的对象。以缺勤为例。此人有一系列缺勤记录(开始日期、结束日期、原因)。这些当前通过人员进行管理(记账缺勤、变更缺勤、取消缺勤)。当添加缺勤时,我需要对照所有其他缺勤进行验证,因此我需要一个可以访问其他缺勤的对象来执行此验证

我是不是遗漏了什么?是否有另一个AR我还没有确定?在过去,我会通过“缺席管理器”服务来完成这项工作,但我希望使用DDD来完成

我是DDD的新手,所以可能我遗漏了什么


非常感谢……

缺席可以建模为一个集合。当您要添加新的缺勤时,缺勤工厂可以根据其他缺勤进行验证

代码示例:

public class AbsenceFactory {
    private AbsenceRepository absenceRepository;
    public Absence newAbsenceOf(Person person) {
         List<Absence> current = 
              absenceRepository.findAll(person.getIdentifier());
         //validate and return
    }
}
公共类缺席工厂{
私人缺席知识库缺席知识库;
公众缺席新缺席(人){
列表当前=
缺勤存储库.findAll(person.getIdentifier());
//验证并返回
}
}
您可以在蓝皮书中找到这种模式(如果我没有弄错的话,请参阅第6.2节工厂)

在其他“修改”情况下,您可以引入规范

public class SomeAbsenceSpecification {
    private AbsenceRepository absenceRepository;

    public SomeAbsenceSpecification(AbsenceRepository absenceRepository) {
        this.absenceRepository=absenceRepository;
    } 

    public boolean isSatisfiedBy(Absence absence) {
          List<Absence> current = 
              absenceRepository.findAll(absence.getPersonIdentifier());
         //validate and return
    }
}
公共类SomeAbscenceSpecification{
私人缺席知识库缺席知识库;
公共缺勤规范(缺勤存储库缺勤存储库){
this.absenceRepository=缺席存储库;
} 
公共布尔值Issatifiedby(缺勤){
列表当前=
缺勤存储库.findAll(缺勤.getPersonIdentifier());
//验证并返回
}
}

您可以在蓝皮书(第9.2.3节规范)中找到此模式。

缺勤可以建模为聚合。当您要添加新的缺勤时,缺勤工厂可以根据其他缺勤进行验证

代码示例:

public class AbsenceFactory {
    private AbsenceRepository absenceRepository;
    public Absence newAbsenceOf(Person person) {
         List<Absence> current = 
              absenceRepository.findAll(person.getIdentifier());
         //validate and return
    }
}
公共类缺席工厂{
私人缺席知识库缺席知识库;
公众缺席新缺席(人){
列表当前=
缺勤存储库.findAll(person.getIdentifier());
//验证并返回
}
}
您可以在蓝皮书中找到这种模式(如果我没有弄错的话,请参阅第6.2节工厂)

在其他“修改”情况下,您可以引入规范

public class SomeAbsenceSpecification {
    private AbsenceRepository absenceRepository;

    public SomeAbsenceSpecification(AbsenceRepository absenceRepository) {
        this.absenceRepository=absenceRepository;
    } 

    public boolean isSatisfiedBy(Absence absence) {
          List<Absence> current = 
              absenceRepository.findAll(absence.getPersonIdentifier());
         //validate and return
    }
}
公共类SomeAbscenceSpecification{
私人缺席知识库缺席知识库;
公共缺勤规范(缺勤存储库缺勤存储库){
this.absenceRepository=缺席存储库;
} 
公共布尔值Issatifiedby(缺勤){
列表当前=
缺勤存储库.findAll(缺勤.getPersonIdentifier());
//验证并返回
}
}

您可以在蓝皮书(第9.2.3节规范)中找到此模式。

这确实是使聚合设计如此棘手的原因。所有权并不一定意味着聚合。一个人需要理解这个领域才能给出正确的答案,所以我们将使用好的ol'
顺序
示例。
客户
不会有
订单
对象的集合。最简单的规则是考虑删除AR。那些在没有AR的情况下有意义的对象可能不属于AR。不过,
Customer
很可能有一组
ActiveOrder
对象。当然,会有一个不变量声明,如果客户有活动订单,则不能删除该客户

另一件需要注意的事情是膨胀的有界上下文。可以想象的是,您可能有一个或多个未被识别的有界上下文,从而导致AR做得太多的情况

因此,在您的情况下,如果
客户
被删除,您可能仍然对
缺席
感兴趣。对于
订单行
而言,如果没有其
订单
,它就没有任何意义。因此没有自己的生命周期


希望这能起到些许帮助。

这确实是聚合设计如此棘手的原因。所有权并不一定意味着聚合。一个人需要理解这个领域才能给出正确的答案,所以我们将使用好的ol'
顺序
示例。
客户
不会有
订单
对象的集合。最简单的规则是考虑删除AR。那些在没有AR的情况下有意义的对象可能不属于AR。不过,
Customer
很可能有一组
ActiveOrder
对象。当然,会有一个不变量声明,如果客户有活动订单,则不能删除该客户

另一件需要注意的事情是膨胀的有界上下文。可以想象的是,您可能有一个或多个未被识别的有界上下文,从而导致AR做得太多的情况

因此,在您的情况下,如果
客户
被删除,您可能仍然对
缺席
感兴趣。对于
订单行
而言,如果没有其
订单
,它就没有任何意义。因此没有自己的生命周期

希望这对你有点帮助

我正在建立一个系统来管理个人信息

您确定一个简单的CRUD应用程序