设置会话工厂

时间:2010-11-18 12:03:22

标签: nservicebus

如何将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

2 个答案:

答案 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有自己的。但很难想象你真的想要。