NServiceBus,NHibernate和GuidComb()

时间:2011-01-13 09:57:56

标签: nhibernate nservicebus identifier

免责声明:这是来自my other question about NServiceBusanswered very thoroughly的后续问题。

我目前的问题是:如果一个网站像上面提到的文章那样“愚蠢”,建议那么下面的场景如何运作?

用户通过填写​​包含相关详细信息的表单在网站上注册。当用户单击表单上的“提交”按钮时,Web应用程序将获取表单数据并创建一条消息,使用NServiceBus和Bus.Send()将其发送到应用程序层。应用程序层涉及创建新用户和发布用户已创建的事件(Bus.Publish())的业务,以便其他进程可以执行其操作(通过电子邮件发送新用户,将用户添加到搜索索引)等等。)

现在,由于此场景中的Web应用程序完全依赖于用于创建新用户实例的应用程序层,因此如何了解用户的ID?如果我在这种情况下没有使用NServiceBus,而是让网站发出对DAL的进程内调用,我会使用NHibernate的GuidComb()策略为新用户创建标识符,然后将新行保存在数据库。如果接收创建新用户的命令的消息处理程序应用程序(在当前方案中)使用相同的策略,那么userId如何传回Web应用程序?

我是否必须采用不同的策略来管理此类场景中的标识符?

2 个答案:

答案 0 :(得分:3)

您可以通过将其放在Web应用程序中的消息中来提供用作correlation identifier的ID,从而允许它随身携带,而且每个进程都由消息启动。

这样,您可以将请求与系统周围的其他事件相关联,只要他们记得提供相关ID。

但听起来您希望在同一个Web请求中将您的用户ID反馈给您 - 使用异步后端无法轻松完成,而这正是消息传递给您的。

在创建用户时向用户发送电子邮件,包含到某种网关的(秘密)链接,恢复用户的会话,是不是可以接受?

答案 1 :(得分:0)

UI是否能够收听“用户创建”事件的总线?然后,您可以通过将事件包含某种事件ID链接回“请求的用户创建”事件或事件中的某些其他众所周知的数据(如用户名)来关联。虽然您可能还必须收听多个事件,例如“用户创建失败”事件。

这与Web浏览器中的常规AJAX处理不同。从技术上讲,您不会阻止带外呼叫回到Web服务器。您调用该调用并异步等待回调。