使用Autofac的NServiceBus中的NHibernate会话管理

使用Autofac的NServiceBus中的NHibernate会话管理,nhibernate,nservicebus,autofac,Nhibernate,Nservicebus,Autofac,Andreas Ohlund有一篇优秀的文章,介绍了如何使用Structuremap连接NHibernate会话,使其自动登记到NSB事务中 有人知道使用Autofac是否可以达到同样的效果吗?我的一位同事给了我awnser public class NHibernateMessageModule : IMessageModule { /// <summary> /// Injected SessionManager. /// </summary>

Andreas Ohlund有一篇优秀的文章,介绍了如何使用Structuremap连接NHibernate会话,使其自动登记到NSB事务中


有人知道使用Autofac是否可以达到同样的效果吗?

我的一位同事给了我awnser

public class NHibernateMessageModule : IMessageModule
{
    /// <summary>
    /// Injected SessionManager.
    /// </summary>
    public ISessionManager SessionManager { get; set; }

    public void HandleBeginMessage()
    {
        //this session need for NServiceBus and for us
        ThreadStaticSessionContext.Bind(SessionManager.OpenSession()); //CurrentSessionContext or  ThreadStaticSessionContext
    }

    public void HandleEndMessage()
    {
        SessionManager.Session.Flush();
    }

    public void HandleError()
    {
    }
}

您的操作与您提到的文章中的操作完全相同,但请选择一个Autofac生命显微镜。如果在消息处理中有其他类需要注入会话,那么可以像下面这样使用InstancePerLifetimeScope

public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher, IWantCustomInitialization
{

    public void Init()
    {
        var builder = new ContainerBuilder();
        builder.Register(s => SessionFactory.CreateSessionFactory()).As<ISessionFactory>().SingleInstance();
        builder.Register(x => x.Resolve<ISessionFactory>().OpenSession()).As<ISession>().InstancePerLifetimeScope();

        var container = builder.Build();
        Configure.With().AutofacBuilder(container);
    }

}
公共类EndpointConfig:IConfigureThisEndpoint,AsA_发布者,IWantCustomInitialization
{
公共void Init()
{
var builder=new ContainerBuilder();
注册(s=>SessionFactory.CreateSessionFactory()).As().SingleInstance();
注册(x=>x.Resolve().OpenSession()).As().InstancePerLifetimeScope();
var container=builder.Build();
配置.With().AutofacBuilder(容器);
}
}

您还可以在您的NSB上下文中注册您需要的任何其他依赖项,并且您将确保由于使用子容器,它被正确地实例化和配置。

这些会在您的系统中引入奇怪的锁吗?
public class EndpointConfig : IConfigureThisEndpoint, AsA_Publisher, IWantCustomInitialization
{

    public void Init()
    {
        var builder = new ContainerBuilder();
        builder.Register(s => SessionFactory.CreateSessionFactory()).As<ISessionFactory>().SingleInstance();
        builder.Register(x => x.Resolve<ISessionFactory>().OpenSession()).As<ISession>().InstancePerLifetimeScope();

        var container = builder.Build();
        Configure.With().AutofacBuilder(container);
    }

}