我们创建了一个Web应用程序,它是一个电子书阅读器。因此要记住的一件事是,域名并不完全是阅读实体书籍的域名。我们现在正试图通过存储用户访问的电子书页面信息来收集用户的阅读行为。由于这些信息发送到数据仓库,我们认为从bookcontroller中提取事件是正确的方法。
bus.Publish()
但是我们不确定它应该是发布还是发送,因为此活动真的只有一个消费者,那就是我们的商业智能团队。我们还读到,不建议从网络应用程序发布(http://www.make-awesome.com/2010/10/why-not-publish-nservicebus-messages-from-a-web-application /)。所以现在替代方法是使用bus.Send(RecordPageAccessedCommand)
但是上面的命令无论如何都不会改变我们的应用程序状态。它真的是一个命令吗?我感觉我们犯的错误是使用NServiebus的功能(发布,发送)并尝试将其与命令或事件等同起来。
请让我知道解决方法是什么。
答案 0 :(得分:10)
根据您提供的信息,我建议您“发送”到您的终端。
发送命令意味着处理消息的端点应该执行某些操作。在您的情况下,记录访问页面是端点应该做的事情。
发布事件意味着您正在通知0..n订阅者发生了某些事情。如果系统中的某些其他服务对访问页面感兴趣,则可以从命令处理程序发布事件。这里的关键点是,在你录制它之前,它不是一个“事实”。
我发现一旦数据可用,消费者就会增长。能够从命令处理程序发布事件将使得通知新消费者而不改变/冒现有代码库的风险变得微不足道。
答案 1 :(得分:1)
RecordPageAccessedCommand是一个命令,因为它命令系统执行某些操作,在这种情况下,记录一个页面已被访问。
如果我已正确理解您的情景。应该从您的控制器向“商业智能团队服务”发送一条消息,告诉系统记录已访问的页面。此服务将存储此信息,并将成为此信息的所有者/技术权限。
其他服务不应以纯粹形式存储或要求此信息,但是他们可以在高度设计的场景中订阅来自此服务的事件,例如,当用户阅读1000页时,“商业智能团队服务”可以发布已经读取了1000页的事件,即Bus.Publish(),可以由计费服务处理,该服务在下次购买时为用户提供折扣。
数据仓库可以访问存储在“商业智能团队服务”中的此信息,因为它属于IT / OPS。