Domain driven design 在会议管理中使用独立的有界上下文人员管理(发言人、主席、作者、参与者)?

Domain driven design 在会议管理中使用独立的有界上下文人员管理(发言人、主席、作者、参与者)?,domain-driven-design,microservices,bounded-contexts,Domain Driven Design,Microservices,Bounded Contexts,我们构建了一个用于规划会议科学计划的应用程序,包括会议室、会议、讲座(口头或海报演示)、演讲者、椅子等(计划背景) 其中一个重要部分是科学论文,其作者来自论文提交,这也可能导致讲座或海报展示 纸张管理上下文是一个单独的有界上下文,使用外部api在第三方工具之间同步数据。它充当程序规划上下文的反腐败层(ACL) 演讲者、主席和作者的概念有一个共同的人。我想引入一个独立的人员管理上下文,以减少重复的人员,并使用人员的唯一标识符在程序规划和文档管理上下文中重用唯一的人员,并通过复合UI显示信息。稍后,

我们构建了一个用于规划会议科学计划的应用程序,包括会议室、会议、讲座(口头或海报演示)、演讲者、椅子等(计划背景)

其中一个重要部分是科学论文
,其作者来自论文提交,这也可能导致讲座或海报展示

纸张管理上下文是一个单独的有界上下文,使用外部api在第三方工具之间同步数据。它充当程序规划上下文的反腐败层(ACL)

演讲者、主席和作者的概念有一个共同的人。我想引入一个独立的人员管理上下文,以减少重复的人员,并使用人员的唯一标识符在程序规划和文档管理上下文中重用唯一的人员,并通过复合UI显示信息。稍后,我们希望为另一个第三方api集成另一个具有相同ACL逻辑的会议注册上下文

正如我从许多书籍、博客等中学到的,只有人员管理上下文应该拥有人员的数据并创建新实例。 结果是,当从外部纸张管理api导入所有数据时,每个作者创建一个新的人员(同步api调用),或者在开始时使用一个批处理调用


这个联轴器是否过高?我应该在论文管理上下文中存储作者的重复个人数据吗?这似乎是错误的,并使重复数据消除变得困难。

您可能需要重新考虑使用DDD。如果没有DDD的约束,这可能更容易解决,因为它听起来好像有很多数据。 假设您想要保留DDD,那么您需要解耦您的上下文。有几种方法可以将上下文解耦,但我最喜欢的两种方法是:

  • 域事件
  • RESTAPI
  • 您可以在提取每个作者后触发域事件,并且该事件可以由任何需要它的上下文处理。您可以使用RESTAPI发送作者数据,并将其用作第二个域的“应用程序服务”


    我想我理解你的问题。如果我没有解决它或解决完全不同的问题,请纠正我。

    欢迎使用SO!我认为如果你复习并修改你的问题,你可以提高得到答案的机会。这个问题太宽泛了。谢谢,很高兴来到这里,我试着把它缩短了一小段,主要是关于如何定义数据的上下文。当数据的上下文不同时,即使某些值相同,也不会重复。在论文管理服务中,您只存储与论文相关的作者数据,可能是他的姓名和年龄。在作者服务中,您将存储描述作者的相关数据,其中还包括姓名和年龄,但上下文不同。如果你需要个人服务,那么你可以描述那里的人,而不是作者。虽然从理论上讲,个人工作可能是指作者的工作ID。作者数据如“isPresentingAuthor”、“isCorrespondingAuthor”、“position”以及作者为论文工作的所有机构都在论文上下文中。姓名,电子邮件。。。仅用于在纸张上下文中显示原因。正如我在许多文章/书籍中读到的那样,“如果上下文无法在不请求其他服务的情况下工作,则在其他上下文中复制数据”。通过使用复合UI,您仍然可以在论文上下文中完成所有与论文相关的工作,如“重新排序作者”、“更改从属关系”、“更改呈现作者”。如果person服务失败,我们将无法显示姓名。听起来是这样吗?人的概念是胡说八道。在DDD中,“人”在给定的上下文中扮演一个角色,所以它要么是演讲者,要么是与会者,要么是作者,而不是其他人。就我所读到的,你们只关心这些概念的概念同一性,就这样。拥有一个人BC是错误的,事实上,拥有一个类“人”(在OO中)从哲学概念上来说是错误的。你可能会认为所有这些都是用户,所以用用户BC替换用户BC,但这也是错误的。请记住,您只关心不同BC中“谁是谁”的价值观。谢谢您的回复。我已经考虑过一个AuthorCreated事件,person上下文可以为会议添加一个新的人物。但是我有一个问题,这个人可以在人的上下文中同时在文件管理上下文中更新。这两个站点都可能发出一个事件,例如PersonUpdate和Author Update,这将导致冲突。这有帮助吗?请记住,这两个实体应该是不同的,并且基于上下文。应该没有太多时间需要同步它们。它们应该可以改变,并且不会相互影响,特别是如果您有一种定义良好的通用语言,并且您已经正确地定义了您的上下文。如果绝对需要同步,您的域将需要足够智能来解决任何冲突。准确地说,用普遍存在的语言,您可以说“作者是为不同机构撰写论文的人,可以是不同类型的人(演示、通信、合著者)”。这就是我提取“人”概念的原因。例如,在电子商务示例中,客户在其他上下文(如Shipping)中主要只是一个id,但扩展了“Shipping address”,它仅与Shipping上下文相关。