我有一个聚合:
public class MyAggregate {
private Country country;
private List<SomeEntity> someEntities;
public SomeEntity getBestMatchingSomeEntity();
}
我的问题是,getBestMatchingSomeEntity()的行为应该可以根据国家/地区进行配置,所以我喜欢使用策略(简单的Spring bean)。
我不确定如何在我的实体中“注入”策略。通常我会使用某种选择器,但我不想在我的实体中注入服务。或者我应该在创建实体时选择正确的策略并在实体中注入策略?或者是域名服务的方式?
谢谢!
答案 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
选择正确策略的逻辑,您可以将所有不同的策略分开。