如何检索某种类型的所有AutoFac组件?

问题描述:

我正在写一个需要使用多个NHibernate会话工厂的MVC 4应用程序。我正在使用AutoFac按名称注册这些对象。在我的global.asax中,我需要检索所有会话工厂,并将它们绑定/解除绑定到CurrentSessionContext。如何检索某种类型的所有AutoFac组件?

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中检索我的SessionFactory的问题。也就是说,当我尝试使用Resolve方法检索它们时,我收到了一个空集合。然而,事情的工作,如果我改用ResolveNamed方法:

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

虽然这个工作,它似乎相当脆弱(如有更改名称,或者我添加/删除SessionFactories我必须更新此代码)。有没有办法从类型中检索AutoFac中的所有对象,其中包括命名实例

+0

[autofac:如何解析命名类型的集合?](http://*.com/questions/5779517/autofac-how-to-resolve-collection-of-named-types) – nemesv 2013-02-23 13:16:10

+0

不是重复。引用的问题询问如何解析命名实例。我问如何解决所有类型的实例,无论他们如何注册容器(名称,密钥,匿名) – 2013-02-25 03:19:54

使用Resolve<IEnumerable<ISessionFactory>>()

进一步的信息请参见Relationship Types

+1

我试过了,但AutoFac返回一个空列表。 – 2013-02-27 16:17:45

+0

呵呵,我不知道这个名字的注册是如何运作的。如果你的名字是'Name (“name”),如()'那么我的回答就可以工作,但我不知道你的情况是否可以接受。 – 2013-02-28 15:40:20