1

我在整个堆栈中都遵循干净的拱形/坚固的原则。我遇到了一种情况,我想在域逻辑中的一些实体 id 字段中嵌入一个 UUID,例如:

  • 创建OrganizationEntityid=abc123
  • 创建一个并在创建时将拥有它的 idItemEntity嵌入到id 字段中,即: 我正在考虑走这条路线,以便我可以减少数据库查找的数量以查看是否有人可以访问- 如果客户端请求属于然后我可以在客户端请求会话 id 和请求记录上对 abc123 进行模式匹配...这将大大提高性能。OrganizationEntityItemEntityItem.id = itm-abc123-sdfnj344ItemEntityOrganizationEntityItemEntity

这是一个已知的模式/实现吗?有什么顾虑或陷阱吗?

4

1 回答 1

1

尽量让你的领域模型尽可能接近领域专家的语言。因此,如果 anItem属于某个组织,则可以在Item. 但是,如果一个项目属于另一个域对象并且这个项目属于一个组织,则由于性能(持久性)原因,您不应该在项目域对象中引用该组织。

你说你想检查是否有人可以访问ItemEntity. 这意味着存在一种ItemEntity可以访问对象的上下文。

我看到了实现这种上下文的 3 个选项:

  1. 具有组织 ID 参数的存储库 API

    public interface ItemRepository {
        public List<ItemEntity> findItems(...., organizationId);
    }
    

    当您在每个存储库调用中传递组织 ID 时,存储库是无状态的。但这也意味着您必须将组织 ID 从控制器传递到用例,然后再传递到存储库。

  2. 绑定到组织的存储库

    公共 ItemRepository { 私有 UUID 组织 ID;// 这里省略了构造函数

        public List<ItemEntity> findItems(...){}
    

    }

    当您创建绑定到组织的存储库时,您必须在需要时(以及用例)创建它,因为它是有状态的。但是你可以确定没有人可以得到他不被允许看到的物品。

  3. 呼叫上下文中的组织 ID

    当控制器被调用时,它从会话中获取组织 ID,将其放入调用上下文并调用用例。在 Java 中,您将使用ThreadLocal. 您还可以将其作为一个方面来实现并将其应用于每个控制器 (AOP)。然后,存储库实现可以访问调用上下文并获取组织 ID,并在其查询中使用它或在返回项目之前过滤项目。

    此选项将允许您访问控制流中每一层的组织 ID,例如在所有用例、实体、存储库中或当您调用外部服务时。

在所有这三种情况下,您都可以避免仅出于数据库访问原因将组织 ID 放入项目中。

于 2022-02-03T07:41:12.393 回答