如何将nservice总线使用的当前会话工厂注入自定义传奇查找器?
我已使用以下代码初始化了传奇
NServiceBus.Configure.With()
.CastleWindsorBuilder()
.Sagas()
.NHibernateSagaPersister()
.XmlSerializer();
我有一个sagafinder
public sagafinder:saga<...>
{
private ISessionFactory sessionFactory;
public virtual ISessionFactory SessionFactory
{
get { return sessionFactory; }
set { sessionFactory = value; }
}
}
但是此会话工厂始终为null。 我知道我没有设置会话工厂。我怎么设置它?
谢谢, Ajai
答案 0 :(得分:2)
根据这篇文章的年龄来判断,我将假设您使用的是像NS一样的NServiceBus版本。
我一直在研究这个并为内置的NHibernateSagaPersister编写Saga Finders是一个难题。
NHibernateSagaFinder使用已经融入NServiceBus.Core.dll的Ilmerged版本的NHibernate。因此,当您编写以下内容时(从默认的saga finder中删除):
public class MySagaFinder : IFindSagas<MySaga>
{
public NHibernate.ISession Session {get; set;}
...
}
这里的ISession将引用NHibernate.dll中的那个,你引用的不是NServiceBus的内部NHibernate。据我所知,不可能引用NServiceBus.Core的NHibernate,因为它是“内部的”。这意味着NServiceBus使用的IOC容器要么不注入会话,要么根据你设置的方式注入错误的容器。
我一直在研究这个问题,我认为最好(唯一)要做的就是根据内置的NServiceBus创建自己的自定义SagaFinder。这不应该像在GitHub上的代码库那样难以做到。
这可以通过更高版本的NServiceBus(&gt; = 3)修复,但我不确定,因为我认为他们现在使用RavenDB来实现默认的saga持久性。
答案 1 :(得分:0)
问题中的代码根本不像是一个传奇查找器。我所看到的是一个传奇本身。如果你只是想根据信息中的某些属性找到传奇,亚当的建议是正确的。你不需要会话工厂,只应覆盖ConfigureHowToFindSaga()。如果你正在尝试做其他事情,那么nhibernate saga persister使用的会话工厂确实没有注册你的容器,这样你就可以解决你的传奇中的依赖。但是,你真的很想查询存储在自己身上的传奇。所以,如果你真的有理由,我可能只是建议你使用saga信息为数据库注册一个会话工厂yourelf,让nservicebus有自己的。但很难想象你真的想要。