5

我们创建了一个作为电子书阅读器的 Web 应用程序。所以要记住的一件事是,该领域并不完全是阅读实体书的领域。我们现在正试图通过存储用户访问的电子书页面的信息来收集用户的阅读行为。由于此信息进入数据仓库,我们认为从 bookcontroller 引发事件是正确的方法。

总线.Publish()

但是我们不确定它应该是发布还是发送,因为这个事件实际上只有一个消费者,那就是我们的商业智能团队。我们还了解到,不建议从 Web 应用程序发布 (http://www.make-awesome.com/2010/10/why-not-publish-nservicebus-messages-from-a-web-application /)。所以现在的替代方法是使用 bus.Send(RecordPageAccessedCommand)

但是上面的命令无论如何都不会改变我们的应用程序状态。那么它真的是一个命令吗?我有一种感觉,我们正在犯的错误是使用 NServiebus 的功能(发布、发送)并试图将其等同于命令或事件。

请让我知道解决方案是什么。

4

2 回答 2

12

根据您提供的信息,我建议“发送”到您的端点。

发送命令意味着处理消息的端点应该做一些事情。在您的情况下,记录页面被访问是端点应该做的事情。

发布事件意味着您正在通知 0..n 个订阅者发生了某事。如果系统中的其他服务对访问页面的事实感兴趣,则可以从命令处理程序发布事件。这里的关键点是,在你记录下来之前它不是一个“事实”。

我发现一旦数据可用,消费者往往会增长。能够从命令处理程序发布事件将使通知新消费者变得微不足道,而无需更改/冒着现有代码库的风险。

于 2012-05-01T04:45:26.397 回答
1

RecordPageAccessedCommand 是一个命令,因为它命令系统做某事,在这种情况下,记录页面已被访问。

如果我正确理解了您的情况。应该从您的控制器向“商业智能团队服务”发送一条消息,告诉系统记录页面已被访问。该服务将存储此信息,并将成为此信息的所有者/技术权威。

任何其他服务都不应该以纯粹的形式存储或需要此信息,但是它们可以从该服务订阅事件,例如,在高度人为的场景中,当用户阅读 1000 页时,“商业智能团队服务”可以发布一个事件已读取 1000 页,即 Bus.Publish(),这可能由计费服务处理,为用户下次购买提供折扣。

数据仓库可以访问存储在“商业智能团队服务”中的这些信息,因为它属于 IT/OPS。

于 2012-05-01T05:06:34.310 回答