NServiceBus、NHibernate和GuidComb()

NServiceBus、NHibernate和GuidComb(),nhibernate,nservicebus,identifier,Nhibernate,Nservicebus,Identifier,免责声明:这是一个后续问题 我现在的问题是:如果一个网站像上面提到的文章所建议的那样是“愚蠢的”,那么下面的场景是如何工作的 用户通过填写包含相关详细信息的表格在网站上注册。当用户单击表单上的“提交”按钮时,web应用程序将获取表单数据并创建一条消息,并使用NServiceBus和Bus.Send()将该消息发送到应用层。应用层负责创建新用户并发布已创建用户的事件(Bus.Publish()),以便其他进程可以执行它们的任务(向新用户发送电子邮件、将用户添加到搜索索引等) 现在,由于此场景中的w

免责声明:这是一个后续问题

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

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

现在,由于此场景中的web应用程序完全依赖于应用程序层来创建新的用户实例,它如何知道用户的id?如果在这个场景中我没有使用NServiceBus,而是让网站向DAL发出进程内调用,那么我会使用NHibernate的GuidComb()策略为新用户创建标识符,然后将新行持久化到数据库中。如果接收创建新用户命令的消息处理程序应用程序(在当前场景中)使用相同的策略,那么如何将用户ID传回web应用程序


在这样的情况下,我是否必须应用不同的策略来管理标识符?

您可以通过将ID放在web应用程序中的消息中,自由地提出一个ID用作标识,允许它在消息启动的每一个过程中都被携带

这样,只要系统中的其他事件记得提供相关ID,您就可以将请求与它们关联起来

但这听起来像是希望用户ID在同一个web请求中反馈给您——这在异步后端是不容易做到的,这就是消息传递给您的


当用户被创建时,向用户发送一封电子邮件,其中包含一个指向某种网关的(秘密)链接,以恢复用户会话,这难道不是可以接受的吗?

UI难道不能监听“用户创建”事件的总线吗?然后,您可以通过让事件包含某种类型的事件ID链接回“用户创建请求”事件或与事件中的其他一些已知数据(如用户名)进行关联。尽管您可能还必须侦听多个事件,例如“用户创建失败”事件


这与web浏览器中的普通AJAX处理没有什么不同。从技术上讲,您不会阻止对web服务器的带外回调。调用调用并异步等待回调。

Hello。这是一个好主意,我使用了一些类似的异常屏蔽,其中错误在两个系统之间进行通信,并在每个系统中使用不同的标识符进行持久化。但是,在这种情况下,相关标识符的寿命是多少?我不一定需要在同一个web请求中将用户Id反馈给我,但我希望能够在系统中尽可能多地使用实际用户Id,而不是将其与相关Id结合使用。否则我将不得不在两个ID上建立索引。。。六羟甲基三聚氰胺六甲醚!值得深思。好建议。谢谢您应该只使用关联ID来关联与创建用户的过程相关的消息/事件。一旦创建了用户,并且知道了用户ID,我认为应该丢弃关联ID,因为它是“本地的”创建用户的过程。尝试并设计您的命令,使它们不会有失败的理由。Ie让您的网站验证用户选择的用户名是否有效和可用。然后使用该用户名进行关联。这有意义吗?谢谢你的评论。我一整天都在断断续续地看这个问题,我想这可能行得通。用户在确认自己的电子邮件地址之前实际上没有任何权限,因此在此之前,她根本不会创建或更改任何数据。所以我可以在那一点交换相关id。美好的但是,为了让它工作,线程必须保持活动状态,不是吗?我认为这是不可能的,但我很高兴能站出来纠正。好的,让我们假设这是一个ASP.NET WebForms页面。页面中已存在异步处理的概念。例如,您可以启动3个SQL命令并异步等待它们全部完成(想法是并行执行它们而不是连续执行。通常,等待异步响应会有某种超时。如果超时,您仍然可以使用某种刷新选项,只需重新订阅并再次等待响应消息。