0

Andreas Ohlund は、 Structuremap を使用して NHibernate セッションを接続し、NSB トランザクションに自動的に参加させる方法についての優れた記事をここに書いています。

Autofacで同じことを達成できるかどうか知っている人はいますか?

4

2 に答える 2

1

言及した記事とまったく同じことを行いますが、Autofac ライフスコープの 1 つを選択します。セッションを挿入するメッセージ処理に他のクラスが関与している場合は、次のように 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 コンテキスト内に登録することもできます。子コンテナーを使用することで、インスタンス化と適切な処理が確実に行われます。

于 2012-12-11T16:00:21.223 に答える
1

同僚からアンサーをもらいました

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 セッション { get; } ISession OpenSession(); bool IsSessionOpened { get; } void CloseSession(); }

public class NHibernateSessionManager : ISessionManager { private ISessionFactory _sessionFactory; プライベート ISession _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;
    }
}
于 2010-07-13T16:16:14.900 に答える