使用策略配置DDD聚合的行为

时间:2017-09-07 07:06:42

标签: entity domain-driven-design aggregate

我有一个聚合:

public class MyAggregate {

    private Country country;
    private List<SomeEntity> someEntities;

    public SomeEntity getBestMatchingSomeEntity();

}

我的问题是,getBestMatchingSomeEntity()的行为应该可以根据国家/地区进行配置,所以我喜欢使用策略(简单的Spring bean)。

我不确定如何在我的实体中“注入”策略。通常我会使用某种选择器,但我不想在我的实体中注入服务。或者我应该在创建实体时选择正确的策略并在实体中注入策略?或者是域名服务的方式?

谢谢!

2 个答案:

答案 0 :(得分:1)

为了使Aggregate尽可能干净,它应该具有自己用来检查其不变量的行为。复杂查询行为应包含在某些域服务中。

在您的情况下,您应该拥有一个域服务,该服务将策略注入或作为方法参数传递,具体取决于所需的配置。

如果您使用CQRS,那么这种分离会更加明确,其中读取模型将负有此责任。

答案 1 :(得分:1)

首先出现在我的脑海里。

为什么不接受以下服务的方法:

public class MyAggregate {

    private Country country;
    private List<SomeEntity> someEntities;

    public SomeEntity getBestMatchingSomeEntity(MatchingEntityService service);
}

然后将服务定义为:

 public interface MatchingEntityService {

     SearchEntityStrategy strategyFor(Country country);

 }

通过这种方式,您可以在聚合中使用该服务,而不会出现注入问题和亲属序列化问题。

MatchingEntityService将具有根据Country选择正确策略的逻辑,您可以将所有不同的策略分开。