Nservicebus EDA:“;级联;事件还是显式命令? 脚本

Nservicebus EDA:“;级联;事件还是显式命令? 脚本,nservicebus,cqrs,event-sourcing,event-driven-design,eda,Nservicebus,Cqrs,Event Sourcing,Event Driven Design,Eda,假设我有一个系统的三个主要组成部分: UI-收集用户输入并创建通过消息总线发送的LoginUserCommand。然后,用户界面将侦听此消息总线的MessageReceivedEvent 用户服务-接收LoginUserCommand并引发UserLoggeDiEvent。这里的关键部分是,消息服务需要被告知开始接收消息 消息服务-为登录用户引发MessageReceivedEvent 选择权 我的设计问题是关于用户服务和消息服务之间的交互 当用户登录时,需要发生很多事情——服务需要协调,以便U

假设我有一个系统的三个主要组成部分:

  • UI-收集用户输入并创建通过消息总线发送的LoginUserCommand。然后,用户界面将侦听此消息总线的MessageReceivedEvent

  • 用户服务-接收LoginUserCommand并引发UserLoggeDiEvent。这里的关键部分是,消息服务需要被告知开始接收消息

  • 消息服务-为登录用户引发MessageReceivedEvent

  • 选择权 我的设计问题是关于用户服务消息服务之间的交互

    当用户登录时,需要发生很多事情——服务需要协调,以便UI开始接收消息

    我应该

    • 用户服务引发UserLoggeDiEvent,让消息服务收听此事件并执行用户接收消息所需的工作
    ……或者

    • 用户服务引发一个UserLoggeDiEvent,然后创建一个命令-StartMessageReceivingCommand,并将其显式发送到消息服务
    问题:
    每种方法的优点/缺点是什么?(级联事件与显式命令)。还有其他选择吗?

    如果您的服务是真正的服务,只需提出一个UserLoggeDiEvent并让“消息服务”决定下一步要做什么。
    如果用户登录,用户服务应该不知道需要开始接收消息的消息服务。只要发起活动,让每个订阅者自己决定下一步做什么。

    这对我来说没有多大意义。UI本身不是逻辑服务

    消息服务发布的
    MessageReceivedEvent
    消息是否足够公开,以便任何用户界面都可以订阅该提要?如果没有,那么这些信息可能根本不应该发布

    如果除非用户登录,否则不允许用户处理
    MessageReceivedEvent
    s,则用户/安全服务有责任确保不会发生这种情况

    如果确实需要发布
    MessageReceivedEvent
    s,那么为什么不在UI过程中运行user service

  • UI处理订阅(向消息服务发送订阅请求)到
    MessageReceivedEvent
  • UI用户服务的remtoe端点发送
    LoginUserCommand
    ,并在本地处理
    UserLoggedInReply
  • MessageReceivedEvent
    UI过程中有两个处理程序
    • 第一个处理程序属于用户服务,如果用户未登录,则调用bus.DoNotContinueDispatchingCurrentMessageToHandlers()
    • 第二个处理程序属于另一个服务,它实际上对
      MessageReceivedEvent
      s做了一些有用的事情
  • 在步骤3中,当用户登录时,第一个处理程序是禁止操作的。如果用户未登录,第一个处理程序将停止运行其他
    MessageReceivedEvent
    处理程序

    还有更多关于指定消息顺序的内容


    希望这有帮助

    我想这是最有意义的。如果我需要触发消息服务以独立于UserLoggeDineEvent接收消息,那么我应该让它接受命令-例如StartMessageReceivingForUserCommand?命令仅在服务内发送,因此如果消息服务的其他部分需要触发,则可以发送该命令。此时,您可能会重构UserLoggedInEventHandler,以便在事件到达时发送该命令。