Управление сессиями NHibernate в NServiceBus с помощью Autofac - PullRequest
0 голосов
/ 12 июля 2010

У Андреаса Олунда есть отличная статья здесь о том, как использовать Structuremap для подключения сеанса NHibernate, чтобы он автоматически включался в транзакцию NSB.

Кто-нибудь знает, возможно ли добиться того же с Autofac?

Ответы [ 2 ]

1 голос
/ 13 июля 2010

коллега дал мне сообщение

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()
    {
    }
}

открытый интерфейс ISessionManager { ISession Session {get; } ISession OpenSession (); bool IsSessionOpened {get; } void CloseSession (); }

открытый класс NHibernateSessionManager: ISessionManager { частный ISessionFactory _sessionFactory; приватная сессия _session;

    public ISession Session
    {
        get { return _session; } 
        private set { _session = value; }
    }

    public SchemaExport SchemaExport { get; set; }


    public NHibernateSessionManager(ISessionFactory sessionFactory)
    {
        _sessionFactory = sessionFactory;
    }

    public bool IsSessionOpened
    {
        get { return Session != null && Session.IsOpen; } 
    }

    public ISession OpenSession()
    {
        if(Session == null)
        {
            Session = _sessionFactory.OpenSession();
            if (SchemaExport != null)
                SchemaExport.Execute(true, true, false, Session.Connection, null);
        }
        return Session;
    }

    public void CloseSession()
    {
        if (Session != null && Session.IsOpen)
        {
            Session.Flush();
            Session.Close();
        }
        Session = null;
    }
}
0 голосов
/ 11 декабря 2012

Вы делаете то же самое, что и в упомянутой вами статье, но выбираете один из видов жизни 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);
    }

}

Вы также можете зарегистрировать любые другие зависимости, которые вам нужны в контексте NSB, и вы будете увереныон создается и правильно распределяется из-за использования дочернего контейнера.

...