NHibernate SessionFactory线程安全问题

Bob*_*bby 4 c# nhibernate sessionfactory thread-safety

所以这就是问题所在.我有一个公共类库,包含所有存储库,域和映射文件,因此库可以在其他Web beased应用程序中重用.现在,在这个类库中,有一段代码允许自己创建一个在其存储库中使用的会话工厂.代码看起来像这样.

        private static ISessionFactory sessionFactory;
        private static Configuration configuration;

        public static Configuration Configuration()
        {
            if (configuration == null)
            {
                configuration = new Configuration().Configure();
            }
            return configuration;
        }

        private static ISessionFactory SessionFactory
        {
            get
            {
                if (sessionFactory == null)
                {
                    sessionFactory = Configuration().BuildSessionFactory();
                }
                return sessionFactory;
            }
        }

        public static ISession GetCurrentSession()
        {
            if (!CurrentSessionContext.HasBind(SessionFactory))
            {
                CurrentSessionContext.Bind(SessionFactory.OpenSession());
            }
            return SessionFactory.GetCurrentSession();
        }
Run Code Online (Sandbox Code Playgroud)

因此,存储库调用GetCurrentSession()方法来获取ISession.现在这工作正常,但我担心它可能不是线程安全的.任何人都可以帮助我一个方法,帮助我使线程安全.

几点注意事项:

我已经考虑过在启动事件的web应用程序的global.asax中配置和构建SessionFactory,但问题是所讨论的公共类库在20个不同的应用程序中使用,这意味着要进入所有应用程序并更新在我这样做之前的global.asax文件我想在那里提出问题,看看是否还有其他方法可以解决这个问题.这样公共类库可以配置其SessionFactory本身,但仍然是线程安全的.

感谢您阅读这个巨大的问题.将提供任何帮助.

Ste*_*ger 7

会话工厂是线程安全的,会话不是.构建会话工厂需要受到保护:

    private static object lockObject = new object();

    private static ISessionFactory SessionFactory
    {
        get
        {
            lock (lockObject)
            {
                if (sessionFactory == null)
                {
                    sessionFactory = Configuration().BuildSessionFactory();
                }
                return sessionFactory;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

会话工厂是在线程第一次请求会话时创建的.这需要线程安全,以避免多次创建会话工厂.

会话工厂创建会话是线程安全的,因此您不必担心这一点.