c# - 在 DDD 架构中,我应该将与按角色用户过滤数据相关的查询逻辑放在哪里
问题描述
我正在为我的应用程序遵循 DDD 架构。我有应用层、域层和数据访问层(存储库)。假设我在我的应用程序中有 3 个角色:管理员、主管、代理。每个角色都应该访问分配给自己的数据。所以问题是,我是否应该放置查询逻辑以便按存储库中的角色过滤数据,例如
var query = dataContext.Order.Where(...);
if(userRole = "admin")
query =.... filter by admin
If(usrRole = "supervisor")
query =....
return query.ToList();
我认为与业务逻辑相关的逻辑应该放在领域层。但我还没有清除这一点。你们能帮我解决这个问题吗?
解决方案
到目前为止,我读过的最好的解释是来自Wrox 出版的Patterns, Principles and Practices Of Domain-driven Design的解释。下图类似于核心思想。
所有依赖都指向内部,因此领域模型不依赖其他任何东西,并且不知道其他任何东西。其中它是纯粹的,并且可以专注于重要的领域的语言。
应用程序层(包含应用程序服务)公开了一个用例 API,并使用涉及的域服务编排请求。因此,应用服务中的代码是程序化的,而领域模型中的代码通常要丰富得多。也就是说,如果域足够复杂以保证它的存在。
但是我跑题了,回答你的问题,应用层公开了基础设施实现的接口(例如存储库模式)。也是应用层知道如何查询数据(通过使用这个接口),并根据角色进行过滤。
领域模型应该只接收过滤后的集合,并且只关注一件事,处理数据。
为了完整性,DDD 允许许多架构,只要域没有依赖关系。虽然我觉得它最容易掌握,但这样想。
推荐阅读
- node.js - 应用引擎中的云构建触发器 -Nodejs 运行时错误
- php - MySQLi, PHP, 动态生成自动化preparedStatement
- apache-nifi - 如何将文件名保存在 Nifi 的变量中?
- rust - 构建和绑定旧的 libc 版本
- python-3.x - python脚本无限期运行时如何刷新boto3凭证
- java - 连接超时延迟
- cassandra - Grafana loki:它是否支持 Amazon Keyspaces
- javascript - 使用 Jquery append 追加所有 Js 文件的正确方法是什么
- python-3.x - python django Mock SAML 使用 python3-saml 来自 onelogin.saml.auth 库的响应
- primeng - PrimeNG:DynamicDialog 的自定义标题