在 DDD 架构中,我应该将与按角色用户过滤数据相关的查询逻辑放在哪里

Where should I put query logic related to filtering data by role user in DDD architecture

我正在为我的应用程序遵循 DDD 架构。我有应用程序层、域层和数据访问层(存储库)。 假设我在我的应用程序中有 3 个角色:管理员、主管、代理。每个角色都应该访问分配给自己的数据。 所以问题是,我是否应该放置查询逻辑以便按存储库中的角色过滤数据,例如

var query = dataContext.Order.Where(...);
if(userRole = "admin")
query =.... filter by admin
If(usrRole = "supervisor")
query =.... 
return query.ToList();

我认为与业务逻辑相关的逻辑应该放在领域层。但是我还没有清除这个。 你们能帮我解决这个问题吗?

到目前为止,我读过的最好的解释来自 领域驱动设计的模式、原则和实践,由 Wrox 出版。下图类似于核心思想。

所有依赖项都指向内部,因此领域模型不依赖于任何其他东西,也不知道任何其他东西。它是纯粹的,可以专注于重要的领域语言。

应用层(包含应用服务)公开了 API 个用例,并使用涉及的领域服务编排请求。因此,应用服务中的代码是过程性的,而领域模型中的代码通常要丰富得多。也就是说,如果域足够复杂以保证它。

但我跑题了,为了回答你的问题,应用层公开了基础设施实现的接口(例如存储库模式)。应用层也知道如何查询数据(通过使用此接口),并根据角色对其进行过滤。

领域模型应该只接收过滤后的集合,并且只关注一件事,处理数据。

为了完整性,DDD 允许许多体系结构,只要域没有依赖项。虽然我觉得最容易掌握,但这样想。

存储库表示聚合根的集合。因此,当您想要检索一些聚合或聚合列表时,您需要在存储库上执行业务操作。

在你的情况下,我想你有某种 User 聚合,我可以在你的存储库中想到如下方法: findById(UserId id) findByRole(用户角色角色)

虽然 findById() 只会 return 一个聚合和 findByRole() return 的列表聚合。

始终牢记仅return来自相应存储库的完整聚合对象并在域层定义存储库接口,同时将存储库实现放入基础架构层。

可能有一些原因不 return 来自存储库的完整聚合,例如创建摘要或仅计算一定数量,例如具有特定条件的用户数量。但请记住,在这种情况下,只有 return 个不可变对象是只读的。但在大多数情况下,这些信息应该只与执行业务操作相关。