- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试遵循 DDD 原则来创建一个模型来确定身份是否有权访问属于资源的操作。
资源(例如网络服务)是包含多个操作(例如方法)的东西,可以访问也可以不访问。身份是想要访问资源上的一个或多个操作的东西。比如有人在调用webservice方法时使用了api-key,需要判断是否允许访问。
目前看来,Identity和Resource是聚合根,Action是属于Resource的实体。一个 Action 独立存在似乎没有意义;它永远属于一个资源。身份需要知道它有权访问哪些资源操作。这似乎暗示了以下模型。
然而,据我了解,这违反了聚合外的东西不能引用聚合内的实体的原则。它必须通过根。然后我在想,如果 Action 是聚合根而 Resource 是一个实体呢?但这对我来说似乎不太合逻辑。我也一直在考虑将 Resource 和 Action 合并到一个实体中,这将成为一个聚合根,但这对我来说也是错误的。
因此,这让我对如何使用 DDD 原则正确建模感到困惑。有人知道如何对此建模吗?
更新:我尝试创建的模型是用于定义允许身份访问哪些资源操作的身份模型。它不是实际实现资源和操作的模型。
更新 2 - 不变量:所有对象的 Id 都是出生时给定的,是唯一的,不会改变。身份的 ApiKey 在所有身份中必须是唯一的。Action 的名称在聚合中必须是唯一的,但是两个不同的资源可以具有相同名称的 Action,例如资源“R1”可以有一个 Action “A1”,资源“R2”也可以有一个 Action “A1”,但这两个“A1”不一样。
最佳答案
就聚合和实体而言,域模型在 DDD 中的目的是为了简化不变量的表达和实现——因为写入操作应用于模型。
正如@VoiceOfUnreason 的回答中提到的,“这个用户可以对资源 R 执行操作 A”这个问题是一个不一定需要流经域模型的问题 - 它可以通过针对 pre 的查询来回答- 投影只读模型,或针对构成写入模型持久性的表的标准 SQL 查询(取决于您的需要)。
但是,您的问题虽然主要是关于如何识别身份是否被允许执行某项操作,但隐含地寻求一种更简单的模型来更新资源、操作和权限。所以要探索这个想法......隐式有两种类型的写操作:
如果将这两种类型的操作拆分到不同的限界上下文中,它们的模型可能会得到简化。
首先,您将像您所做的那样建模,一个以 Resource 作为聚合根并将 Action 作为包含实体的聚合。这允许强制执行操作名称在资源中必须唯一的不变性。
随着在此上下文中进行更改,您发布事件,例如ActionAddedToResource
,ActionRemovedFromResource
。
在第二个上下文中,您将拥有三个聚合:
ResourceAction 实例将根据从第一个上下文发布的事件进行更新 - 在 ActionAddedToResource 上创建,在 ActionRemovedFromResource 上删除。如果资源没有任何操作,则根本没有 ResourceAction。
权限将包含两个身份引用 - IdentityId
和 ResourceActionId
这种方式在执行操作“允许此用户对此资源执行此操作”时,操作只是创建一个新的权限实例 - 减少影响身份聚合的一致性边界的操作集 - 假设没有需要在身份聚合中强制执行“许可”概念的不变量?
这也简化了查询方面的事情,因为您只需要搜索具有匹配的 identityId
、resourceName
和 actionName
的权限条目加入 Permissions
到 ResourceActions
之后。
战略设计部分中的 DDD 手册指的是根据责任层组织您的上下文。用书中的术语来说,上述建议是基于“能力”责任层(定义资源和操作)和“操作”责任层(定义身份权限和检查身份权限)的想法。
关于domain-driven-design - 解决对实体内部聚合 (DDD) 的外部引用的明显需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39255123/
我是 DDD 的初学者。 我不知道谁负责 API 请求的流程。 我不知道谁负责间接依赖于基础设施层的功能。 如带有 Web API 请求的函数。 例如我正在创建在线购物系统,系统支持取消订单。 我想我
我有一个dispatcher-servlet.xml和一个applicationContext.xml。 我一直在做一些重构,并感动 从dispatcher-servlet.xml到applica
哪些工具可用于元建模? 特别是开发图表编辑器,目前正在试用Eclipse GMF 想知道还有哪些其他选择? 有什么可比性吗? 最佳答案 由于许多方面,您的问题对于单一答案来说太宽泛了。 首先,元建模不
我前段时间学习了决策树和决策表。我觉得决策表可以帮助处理条件 If-Then-Else 语句。特别是,我觉得决策表没有副作用,例如,如果您没有注意到您还需要一个“else if”语句。 但我不确定如何
我们的团队开始实现事件驱动设计。我们现在正在确定记录这些事件的模式的最佳工具和实践是什么。 用于此用例的常用工具有哪些? 任何链接或建议表示赞赏。 最佳答案 我将从常见的 CloudEvents sp
我听说过最小化代码和最大化数据的概念,并且想知道其他人在构建自己的系统时如何/为什么应该这样做的建议? 最佳答案 通常,数据驱动的代码更易于阅读和维护。我知道我已经看到数据驱动被极端化并且最终变得非常
我的工作任务是为物流应用程序编写详细的工程计划,我们正在编码该计划以向客户提出建议。有人告诉我这是一个数据驱动的应用程序。对于应用程序来说,“数据驱动”意味着什么?相反的是什么?尽管在网络搜索时我可以
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗?更新问题,使其仅关注一个问题 editing this post . 关闭 4 年前。 Improve this que
我是 DDD 的新手。现在我在看领域事件。我不确定我是否正确理解了这个领域事件,但我只是在想如果领域事件发布失败会发生什么? 我这里有一个案例。当买家从我的网站订购商品时,首先我们将创建一个对象,Or
当我在我的软件项目中实践 DDD 时,我一直面临这样的问题:“为什么我应该在实体中实现我的业务规则?它们不应该是纯数据模型吗?” 请注意,根据我对 DDD 的理解,域模型可以由持久模型和值对象组成。
我有一个名为 Campaigns 的聚合,每个聚合都有一个名为 campaign 的根实体,这个根实体有一个尝试列表(实体) public class Attempts: IEntity
我正在尝试使用分层架构实现 DDD 应用程序。我有: 基础架构层 - 实现应用程序特定技术部分的层。 领域层——包含领域模型的层。 应用层 - 包含与域模型交互的干扰的层。 和接口(interface
最近学习ddd,里面说两个相关的bounded context之间的关系是upstream和downstream。 但是有没有可能在一种情况下A是上游B是下游,而在另一种情况下B是上游又是下游? 但是
我有一个名为 Order 的实体,以及一个聚合根 OrderManager,它根据来自应用层的请求更新订单状态和一些其他信息(AppLayer 调用 OrderManager,OrderManager
让我们假设场景: 我们有系统的用户 每个 User 都有他们的 Clients(Client 总是分配给一个且只有一个 User)< Users 上传不同的 Documents 并且 Document
这是一个 ASP.NET MVC 网站。 在领域驱动设计之后,我们有一个服务层。我们的 Controller 要求应用程序服务类执行各种任务,然后将结果路由到 View 。 业务逻辑由服务类执行。 例
不,这不是重复问题。我有很多关于这个主题的资源,但我仍然觉得我没有完全理解它。 这是我目前掌握的关于什么是聚合和聚合根的信息(来自多个来源,无论是文章、视频等...): 聚合是多个值对象\实体引用和规
我正在重建一个会计软件。该软件可以处理多种类型的交易,例如销售、库存补货和费用。我没有会计背景,但我在网上学到了一些概念。我正在尝试根据这些原则对域进行建模: 一个日记账分录由几条记录组成,每条记录要
我正在从头开始学习 DDD 主题,在许多 DDD 示例中,我看到“存储库接口(interface)”位于域中。这个存储库的真正目的是什么/它到底做了什么或解决了什么问题?这与持久层实现是否对应或有某种
假设我们有以下内容: DDD聚合了A和B,A可以引用B。 管理 A 的微服务公开以下命令: 创建一个 删除 A 链接 A 到 B 取消 A 与 B 的链接 管理 B 的微服务公开以下命令: 创建 B
我是一名优秀的程序员,十分优秀!