1

我正在编写一个需要使用多个 NHibernate 会话工厂的 MVC 4 应用程序。我正在按名称使用 AutoFac 注册这些对象。在我的 global.asax 中,我需要检索所有会话工厂并将它们绑定/取消绑定到 CurrentSessionContext。

 protected void Application_BeginRequest(object sender, EventArgs e)
        {
            foreach (ISessionFactory sessionFactory in SessionFactories)
            {
                if (!CurrentSessionContext.HasBind(sessionFactory))
                {
                    CurrentSessionContext.Bind(sessionFactory.OpenSession());
                }
            }
        }

        protected void Application_EndRequest(object sender, EventArgs e)
        {
            foreach (ISessionFactory sessionFactory in SessionFactories)
            {
                ISession session = CurrentSessionContext.Unbind(sessionFactory);
                session.Close();
                CurrentSessionContext.Unbind(sessionFactory);
            }
        }

我在从 AutoFac 检索我的 SessionFactories 时遇到问题。也就是说,当我尝试使用该Resolve方法检索它们时,我得到一个空集合。但是,如果我改用以下ResolveNamed方法,事情就会奏效:

 SessionFactories =
                new List<ISessionFactory>
                    {
                        container.ResolveNamed<ISessionFactory>("DB1"),
                        container.ResolveNamed<ISessionFactory>("DB2")
                    };

虽然这可行,但它似乎相当脆弱(如果有任何名称更改,我必须更新此代码,或者我添加/删除 SessionFactories)。有没有办法按包含命名实例的类型从 AutoFac 检索所有对象?

4

1 回答 1

1

利用Resolve<IEnumerable<ISessionFactory>>()

有关详细信息,请参阅关系类型

于 2013-02-26T22:08:09.627 回答