使用 Bus.SendLocal(IMessage) 而不是 Bus.Publish(IEvent) 开始 Saga

Starting a Saga with Bus.SendLocal(IMessage) instead of Bus.Publish(IEvent)

我正在开发一个需要定期轮询第 3 方的应用程序 API。我们在整个项目中大量使用了 NServiceBus,我决定利用 Saga 的优势来帮助维护我的轮询器的状态。

简而言之,Saga 用于维护确保轮询正确完成所需的信息,并为我们提供创建超时(在每次轮询后)以确保下一次轮询发生的简单性,即使出于某种原因该服务 stopped/compromised/blocked。

当我决定通过让服务订阅它自己的事件来启动 Saga,然后在服务启动时发布其中一个事件(使用 IWantToRunWhenBusStartsAndStops)时,我的第一个问题出现了。问题是服务会启动并因此发布事件,但它会在订阅创建之前发生。因此,该服务不会处理本应启动整个 Saga 的事件,除非我重新启动它。重启服务以绕过这个问题,这不是我想考虑的解决方案。

从那时起,经过一些尝试,我发现使用

Bus.SendLocal(new MyMessage());(MyMessage 实现 IMessage)

将有效启动 Saga,无需订阅。 Saga 是在数据库中创建的(我使用 NHibernate 和 MSSQL 进行持久化),并且正确创建了超时并完全按预期运行。

这个解决方案的唯一问题是我正在做一些我在 NServiceBus 文档中找不到任何参考的事情,我担心我可能正在使用一个 "feature",它可能会在未来的版本,由于实际上是一个意想不到的副作用。

简而言之 - 我正在通过使用 SendLocal 发送 IMessage 来开始 Saga。它 100% 有效并解决了我所有的问题,但是 "correct"?

您的解决方案绝对正确,我没有理由不这样做。