0

设想

假设我有一个系统的三个主要组件:

  1. UI - 收集来自用户的输入并创建通过消息总线发送的LoginUserCommand 。然后,用户界面侦听此消息总线以获取MessageReceivedEvent(s)

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

  3. 消息服务-为登录用户引发MessageReceivedEvent(s) 。

选项

我的设计问题是关于User ServiceMessage Service之间的交互。

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

我是不是该...

  • 用户服务是否引发了UserLoggedInEvent并让消息服务监听此事件并执行用户接收消息所需的工作?

...或者...

  • 用户服务是否引发了一个UserLoggedInEvent但然后创建一个命令 - StartMessageReceivingCommand并将其显式发送到消息服务

问题

每种方法的优点/缺点是什么?(级联事件与显式命令)。还有其他选择吗?

4

2 回答 2

1

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

于 2012-08-10T09:23:26.780 回答
0

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

消息服务MessageReceivedEvent发布的消息是否足够公开,以至于任何 UI 都可以订阅该提要?如果没有,那么也许这些消息根本不应该发布。

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

如果MessageReceivedEvents 确实需要发布,那为什么不在UI进程中运行用户服务呢?

  1. UI进程订阅(向消息服务发送订阅请求)到MessageReceivedEvent
  2. UI发送一个到用户服务LoginUserCommand的远程端点并在本地处理UserLoggedInReply
  3. UI进程 MessageReceivedEvent中有两个处理程序
    • 第一个处理程序属于用户服务,如果用户未登录,则调用 bus.DoNotContinueDispatchingCurrentMessageToHandlers()
    • 第二个处理程序属于其他一些实际上对MessageReceivedEvents有用的服务

在步骤 3 中,当用户登录时,第一个处理程序是空操作。如果用户没有登录,第一个处理程序将完全停止其他MessageReceivedEvent处理程序的运行。

这里有更多关于指定消息顺序的信息

希望这可以帮助

于 2012-08-12T08:34:03.497 回答