【问题标题】:Domain service with too many repositories具有太多存储库的域服务
【发布时间】:2016-03-10 09:20:57
【问题描述】:

我有 4 个相关实体:

区(id、名称、市镇、邮政编码) 市镇(ID、名称、城市) 城市(id,名称,省) 省份(id,名称)

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

我认为这违反了 SRP,但找不到更好的方法来做到这一点。我已经阅读了Refactor to Facade Service,但不认为这适用于我的问题。

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

提前致谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 那么在这种情况下你建议我应该使用 Province 作为 ar?市、市、区只是与省相关的价值对象,对吧?是的,我正在使用 php。但我正在与 Laravel 的 Eloquent 合作
    • 你的问题谈到了邮政编码作为 ar。但是你可以有多个ar。因此,对于以省为主要主题的请求/响应,请将其设为 ar。 Eloquent 相当不错,但如果您期望更多的实体和关系,那么我认为 Doctrine 2 可能是一个更好的选择。
    猜你喜欢
    • 2011-11-13
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多