Domain driven design 从saga访问不同的有界上下文数据

Domain driven design 从saga访问不同的有界上下文数据,domain-driven-design,nservicebus,saga,bounded-contexts,Domain Driven Design,Nservicebus,Saga,Bounded Contexts,我用NServiceBus创建了一个传奇,它请求外部服务获取客户信息并超时。超时后,saga将检查外部服务是否有响应。作为回应,我有相应客户的数据,现在我必须检查我们的系统中是否存在相应客户(如果他不存在-我必须创建他),然后我必须创建引用该客户的其他审计实体(如果我有创建他们所需的所有信息) 我想知道我应该如何检查一个特定的客户是否存在,何时不应该如何创建他 到目前为止,我有一些想法: 从消息处理程序内部调用WCF服务(检查、创建) 通过NSB将消息发送到客户范围内的上下文,并等待ID为的响

我用NServiceBus创建了一个传奇,它请求外部服务获取客户信息并超时。超时后,saga将检查外部服务是否有响应。作为回应,我有相应客户的数据,现在我必须检查我们的系统中是否存在相应客户(如果他不存在-我必须创建他),然后我必须创建引用该客户的其他审计实体(如果我有创建他们所需的所有信息)

我想知道我应该如何检查一个特定的客户是否存在,何时不应该如何创建他

到目前为止,我有一些想法:

  • 从消息处理程序内部调用WCF服务(检查、创建)

  • 通过NSB将消息发送到客户范围内的上下文,并等待ID为的响应


为此,您可以利用NServiceBus消息处理管道。首先将“客户服务”中的处理程序配置为运行,该处理程序检查客户是否存在并在必要时创建客户,最后在处理的原始消息上设置CustomerID属性,以便下一个处理程序知道它是什么

这为您提供了整个流程中事务一致性的好处

您描述的发布/订阅模型也可以工作。我不太喜欢它,因为你正在进行一种针对事件的请求/响应,不清楚谁真正对客户信息负责(因为所需数据来自一家不负责客户的出版商)


如果不深入您的领域,就很难做到更具规范性。

您可以利用NServiceBus消息处理管道来实现这一点。首先将“客户服务”中的处理程序配置为运行,该处理程序检查客户是否存在并在必要时创建客户,最后在处理的原始消息上设置CustomerID属性,以便下一个处理程序知道它是什么

这为您提供了整个流程中事务一致性的好处

您描述的发布/订阅模型也可以工作。我不太喜欢它,因为你正在进行一种针对事件的请求/响应,不清楚谁真正对客户信息负责(因为所需数据来自一家不负责客户的出版商)


如果不深入你的领域,就很难更具规范性。

你能描述一下你的第一条信息是什么吗?这可能会影响答案。嗨,Udi,我澄清了我的问题。外部服务也是NSB端点(客户BC)还是类似RPC的web服务?@eulerfx-我请求的外部服务是外部公司提供的类似RPC的web服务。我们系统中的客户BC将作为NSB端点和WCF(特别是UI层)提供。从saga的角度检索客户数据是一个查询(我假设这在BC中不同于客户BC)。我将把这一职责封装在客户业务连续性中,以便它处理对外部服务的调用,并根据需要创建/更新本地数据。然后,当需要客户数据时,saga将向客户BC中的服务发出查询。NSB不是用来处理查询的,因为查询通常需要立即响应。您能描述一下您的第一条消息是什么吗?这可能会影响答案。嗨,Udi,我澄清了我的问题。外部服务也是NSB端点(客户BC)还是类似RPC的web服务?@eulerfx-我请求的外部服务是外部公司提供的类似RPC的web服务。我们系统中的客户BC将作为NSB端点和WCF(特别是UI层)提供。从saga的角度检索客户数据是一个查询(我假设这在BC中不同于客户BC)。我将把这一职责封装在客户业务连续性中,以便它处理对外部服务的调用,并根据需要创建/更新本地数据。然后,当需要客户数据时,saga将向客户BC中的服务发出查询。NSB并不打算处理查询,因为查询通常需要立即响应。