在 DDD 架构中,我应该将与按角色用户过滤数据相关的查询逻辑放在哪里
Posted
技术标签:
【中文标题】在 DDD 架构中,我应该将与按角色用户过滤数据相关的查询逻辑放在哪里【英文标题】:Where should I put query logic related to filtering data by role user in DDD architecture 【发布时间】:2020-05-18 16:13:27 【问题描述】:我正在为我的应用遵循 DDD 架构。我有应用层、域层和数据访问层(存储库)。 假设我在我的应用程序中有 3 个角色:管理员、主管、代理。每个角色都应该访问分配给自己的数据。 所以问题是,我是否应该放置查询逻辑以便按存储库中的角色过滤数据,例如
var query = dataContext.Order.Where(...);
if(userRole = "admin")
query =.... filter by admin
If(usrRole = "supervisor")
query =....
return query.ToList();
我认为与业务逻辑相关的逻辑应该放在领域层。但我还没有清除这一点。 你们能帮我解决这个问题吗?
【问题讨论】:
【参考方案1】:存储库代表聚合根的集合。因此,当您想要检索一些聚合或聚合列表时,您需要在存储库上执行业务操作。
在您的情况下,我想您有某种 User 聚合,我可以在您的存储库中想到以下方法: findById(UserId id) findByRole(UserRole 角色)
而 findById() 只会返回一个聚合,而 findByRole() 返回一个聚合列表。
始终牢记只从相应的存储库返回完整的聚合对象,并在域层中定义存储库接口,同时将存储库实现放入基础架构层。
可能存在不从存储库返回完整聚合的原因,例如创建摘要或仅计算数量,例如具有特定标准的用户数量。但请记住,在这种情况下只返回不可变对象,这些对象是只读的。但这类信息应该只在大多数情况下与执行业务操作相关。
【讨论】:
【参考方案2】:到目前为止,我读到的最好的解释是来自 Wrox 出版的领域驱动设计的模式、原则和实践。下图类似于核心思想。
所有依赖项都指向内部,因此领域模型不依赖其他任何东西,并且不知道其他任何东西。其中它是纯粹的,并且可以专注于重要的领域的语言。
应用层(包含应用服务)公开了一个用例的 API,并使用涉及的域服务编排请求。因此,应用服务中的代码是程序化的,而领域模型中的代码通常要丰富得多。也就是说,如果域足够复杂以保证它的存在。
但我跑题了,回答你的问题,应用程序层公开了基础设施实现的接口(例如存储库模式)。也是应用层知道如何查询数据(通过使用这个接口),并根据角色进行过滤。
领域模型应该只接收过滤后的集合,只关注一件事,处理数据。
为了完整性,DDD 允许许多架构,只要域没有依赖关系。虽然我觉得它最容易掌握,但这样想。
【讨论】:
以上是关于在 DDD 架构中,我应该将与按角色用户过滤数据相关的查询逻辑放在哪里的主要内容,如果未能解决你的问题,请参考以下文章