Nservicebus 设置会话工厂

Nservicebus 设置会话工厂,nservicebus,Nservicebus,如何将nservice总线使用的当前会话工厂注入到自定义saga finder 我已经用下面的代码初始化了这个传奇 NServiceBus.Configure.With() .CastleWindsorBuilder() .Sagas() .NHibernateSagaPersister() .XmlSerializer(); 我有一个萨加芬德 public saga

如何将nservice总线使用的当前会话工厂注入到自定义saga finder

我已经用下面的代码初始化了这个传奇

NServiceBus.Configure.With()
                .CastleWindsorBuilder()
                .Sagas()
                .NHibernateSagaPersister()
                .XmlSerializer();
我有一个萨加芬德

public sagafinder:saga<...>
{
 private ISessionFactory sessionFactory;

        public virtual ISessionFactory SessionFactory
        {
            get { return sessionFactory; }
            set { sessionFactory = value; }
        }
}
publicsagafinder:saga
{
私人ISessionFactory sessionFactory;
公共虚拟ISessionFactory会话工厂
{
获取{return sessionFactory;}
设置{sessionFactory=value;}
}
}
但是这个会话工厂总是以空的形式出现。 我知道我没有设置会话工厂。如何设置它

谢谢,
Ajai

问题中的代码看起来根本不像一个传奇发现者。我看到的是一个传奇故事本身。如果你只是想根据信息中的某些属性来寻找传说,亚当的建议是正确的。您不需要会话工厂,只需覆盖ConfigureHowToFindSaga()。如果您尝试执行其他操作,那么nhibernate saga持久化程序使用的会话工厂确实没有注册到您的容器中,这样您就可以解决saga中的依赖关系。不过,你真正想查询自己储存的传奇故事的可能性很小。所以,如果你真的有理由的话,我可能会建议你自己用saga信息为数据库注册一个会话工厂,让nservicebus拥有自己的会话工厂。很难想象你真的会这么做。

根据这篇文章的年龄判断,我假设你使用的是NServiceBus的3之前版本,比如2.6

我一直在研究这个问题,为内置的NHibernateSagaPersister编写传奇发现程序是一个困难的问题

NHibernateSagFinder使用NHibernate的Ilmerged版本,该版本已烘焙到NServiceBus.Core.dll中。因此,当您编写以下内容时(摘自默认的saga finder):

公共类MySagaFinder:IFindSagas
{
public NHibernate.ISession会话{get;set;}
...
}
此处的ISession将引用您所引用的NHibernate.dll中的会话,而不是NServiceBus的内部NHibernate。据我所知,不可能引用NServiceBus.Core的NHibernate,因为它是“内部的”。这意味着NServiceBus使用的IOC容器不会注入会话,或者会注入错误的会话,具体取决于您如何设置会话

我已经对此进行了一段时间的研究,我认为最好(唯一)的方法是基于NServiceBus内置的SagaFinder创建您自己的定制SagaFinder。这应该不难做到,因为它在GitHub的代码库中


这可能会在NServiceBus(>=3)的更高版本中得到修复,但我不确定,因为我认为他们现在使用RavenDB来实现默认的saga持久性。

因为您使用的是NH持久性,所以只要在saga实现中覆盖ConfigureHowToFindSaga()方法,就可以为您找到saga。您能否评论一下内置机制如何无法满足您的情况?
public class MySagaFinder : IFindSagas<MySaga>
{
    public NHibernate.ISession Session {get; set;}
    ...
}