2

我已经阅读了为什么不从 Web 应用程序发布 NServiceBus 消息另一个类似的问题,但我不清楚这是否也适用于服务层。例如,如果服务层由使用 WCF 或 Web API 或任何其他方式构建的 Web 服务或 REST 服务组成,这些服务是否应该发布事件或发送命令?如果这些服务托管在负载平衡的 Web 服务器中,那么文章中概述的问题也适用于这一层。建议将如何改变或不改变?

如果我从事件与命令的定义来看,我所说的消息是事件,例如“创建了一个用户”,因此应该发布一个事件。事实上,创建用户的服务甚至不知道还能做什么,即可能是另一个应用程序应该为它创建一个定制的门户,而另一个应用程序应该向用户发送一个欢迎工具包。这将是一个事件,而不是一个命令。当应用程序服务本身由一个或多个 Web 应用程序组成时,我想我对 Web 应用程序和应用程序服务的定义很感兴趣。

Web应用程序的定义

Web 应用程序是用户通过网络(例如 Internet 或 Intranet)访问的应用程序。

但是,对我来说,用户可以是计算机,因此 Web 服务是 Web 应用程序,这就是这个问题的原因。

编辑:

让我们考虑一个具体的例子。ASP.NET 网站(MVC 或 Web 表单 - 无关紧要)向操作员显示表单,获取包含用户创建数据(名称、用户名、密码)的帖子,并调用 WCF 服务来创建用户。在网站和 WCF 服务之间,我们可以放置 ServiceBus 并发送命令来创建用户(请求/响应),以便我们获得第一篇文章中描述的所有好处。WCF 服务是实际的业务处理层,即它会创建用户。这就是我的问题所在。创建用户后,它应该宣布一个用户已经被创建并且其他系统可以对它做出反应并做他们应该做的任何事情。所以它非常适合发布消息的模式。然而,WCF 服务本身是一个 Web 应用程序,因此具有 Web 应用程序的大部分特征,因此造成了混乱。

4

2 回答 2

2

正如您链接到的 SO 问题的答案中所述,发布事件与实际处理发生的位置有关。顺便说一句:这不是Send 代替的问题,Publish因为这意味着两者是可以互换的,而它们的意图却截然不同。当你想发布时,你发布。

如果您发现自己从 Web 公开的集成层发布,也会出现同样的问题:您应该在代码中执行业务处理还是将其发送到另一个端点进行处理?通常,您应该将其发送到另一个端点。如果有人希望调用它,您甚至可以考虑如何执行相关操作。例如,如果您要发布一条UserCreatedEvent消息,则意味着您创建了一个用户。如何创建用户?我会被迫使用 WCF/Web-Api 层还是可以发送一个CreateUserCommand总线上由某个应用程序端点处理的消​​息?如果是前者,那么您可能需要重新考虑您的设计。但是,如果是后者,则无论如何您都应该从 WCF / Web-Api 发送命令,并且处理端点将执行该Publish位:)

更新: 我的看法是它更多的是关于凝聚力/关注点。您通常会在您的业务内部通过用于命令和事件的服务总线以及用于读取的简单查询层与您的域进行交互。如果您需要向第三方公开任何内容(或者只是通过网络),那么您可以使用 WCF / WS / Web-APi。关键是您应该尽量避免在集成端点(或像网站这样的前端)中进行业务处理。业务处理更适合应用服务器。该规则通常有例外,但如果您能够影响结构,那么您将处于更好的空间。

于 2013-02-21T04:27:16.627 回答
1

事实是,真正负责执行操作的任何代码都应该与发布事件的代码相同。如果您有一个 MVC 应用程序并且在控制器本身中您使用实体框架来插入用户记录,那么这正是 Publish 应该在的位置,就在 SaveChanges 调用之后。但是,如果控制器调用引用的二进制文件或服务来执行“添加用户”调用中涉及的操作,那么发布应该在那里。我的想法是该事件应该与执行您尝试发布其事件的操作的代码并排。

于 2013-02-22T04:48:00.963 回答