尽量让你的领域模型尽可能接近领域专家的语言。因此,如果 anItem
属于某个组织,则可以在Item
. 但是,如果一个项目属于另一个域对象并且这个项目属于一个组织,则由于性能(持久性)原因,您不应该在项目域对象中引用该组织。
你说你想检查是否有人可以访问ItemEntity
. 这意味着存在一种ItemEntity
可以访问对象的上下文。
我看到了实现这种上下文的 3 个选项:
具有组织 ID 参数的存储库 API
public interface ItemRepository {
public List<ItemEntity> findItems(...., organizationId);
}
当您在每个存储库调用中传递组织 ID 时,存储库是无状态的。但这也意味着您必须将组织 ID 从控制器传递到用例,然后再传递到存储库。
绑定到组织的存储库
公共 ItemRepository { 私有 UUID 组织 ID;// 这里省略了构造函数
public List<ItemEntity> findItems(...){}
}
当您创建绑定到组织的存储库时,您必须在需要时(以及用例)创建它,因为它是有状态的。但是你可以确定没有人可以得到他不被允许看到的物品。
呼叫上下文中的组织 ID
当控制器被调用时,它从会话中获取组织 ID,将其放入调用上下文并调用用例。在 Java 中,您将使用ThreadLocal
. 您还可以将其作为一个方面来实现并将其应用于每个控制器 (AOP)。然后,存储库实现可以访问调用上下文并获取组织 ID,并在其查询中使用它或在返回项目之前过滤项目。
此选项将允许您访问控制流中每一层的组织 ID,例如在所有用例、实体、存储库中或当您调用外部服务时。
在所有这三种情况下,您都可以避免仅出于数据库访问原因将组织 ID 放入项目中。