域驱动设计如何在不同的有界上下文中显示审计属性?

时间:2018-06-04 21:07:36

标签: c# domain-driven-design audit-trail

我们目前正在开展一个包含大量有界上下文的大型项目,其中一个用于身份和访问控制,它包含用户,角色实体。用户登录后,他可以使用任何其他模块(Bounded Contexts), 我的问题 - >我们需要显示有关在不同有界上下文中创建或更新数据的用户信息,例如,我们需要显示审计属性,例如 ModifiedBy CreatedBy 用户 对于这些问题,我有两个解决方案: -

  • 分享用户,跨越有界上下文的角色
  • 使用优化的SQL视图从有界上下文中获取聚合数据 请注意,我使用单个数据库,但每个有界上下文都有不同的sachems

1 个答案:

答案 0 :(得分:2)

在DDD中,当您需要使用从一个有界上下文(BC)到另一个有界上下文的模型(如用户)时,您应该使用Anti-corruption layer。这意味着您不能简单地使用相同的模型,而是使用简化的模型,即具有较少的属性,并且必须是不可变的(只读)。

因此,如果用户是IAC BC中的实体,具有许多属性和行为(读取和写入),则在远程BC中它是Value object,即只有IDName作为只读属性。 ACL负责将远程实体转换为本地BC中可以安全使用的本地Value对象。

根据您的体系结构,可以使用CRON作业实施ACL,定期从远程实体更新本地Value对象,或者在事件驱动架构的情况下对远程事件做出反应(CQRS,事件采购) )。您甚至可以将远程数据库oplog拖尾以进行近乎即时的更新。

因此,每个BC应该有自己的数据,并且其中的服务应该能够独立运行。如果一个BC中的服务出现故障,那么另一个BC中的服务应该继续工作。将BC视为模块。

有些人将用户界面视为不同的BC。因此,在这种情况下,optimized SQL views可以存在于这个单独的BC中,并充当具有内置ACL的模型。然而它不能单独起作用。它还通过强制您在所有BC中使用相同的数据库类型甚至实例来将其他BC耦合在一起。