域服务包含太多存储库

时间:2015-12-05 13:17:27

标签: dependency-injection refactoring domain-driven-design aggregation ddd-repositories

我有4个相关实体:

区(id,name,municipality,zip_code) 市(id,name,city) 城市(id,name,province) 省(id,name)

我刚刚创建了一个域服务来获取与Zip代码相关的所有数据。我需要找到与之相关的地区,市,市和省。所以我在我的服务中注入了这4个回购。我从每个存储库读取数据,将其格式化为(id,name),因为我需要的所有数据都是。

我认为存在违反SRP的行为,但无法以更好的方式找到方法。我已经阅读Refactor to Facade Service,但不要认为这适用于我的问题。

我的问题是: 1.我应该将所有这些实体放入聚合中吗? 2.应该在哪里进行数据格式化?在repo服务或从服务调用的另一个类? 3.还有其他更好的解决方案吗?

提前致谢

1 个答案:

答案 0 :(得分:4)

正如您所发现的,每个域实体的一个存储库不能很好地扩展。它基本上忽略了实体之间的关系。

在ddd中有一个聚合根(ar)对象的概念,它基本上是一个具有相关子对象的主节点对象。不同的域上下文将具有不同的ars。功能通常是围绕ars设计的,而不是单个实体。

因此,考虑一下存储库支持给定ar所需的内容。这意味着能够执行一个邮政编码查询并返回由邮政编码根和附加区,城市等组成的ar。

要实现,您可能需要一个包含所有单个实体数据库映射及其关系的主对象。同样,它是重要的关系。每个存储库都可以访问完整的映射信息。

你没有提到一种语言,但在php中这是一个跟随这些概念的对象关系管理器的例子:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/