2013-02-23 5 views
1

Я пишу приложение MVC 4, которое требует использования нескольких сессионных залов NHibernate. Я регистрирую эти объекты с помощью 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); 
      } 
     } 

У меня возникла проблема с извлечением моих SessionFactories из AutoFac. А именно, когда я пытаюсь восстановить их с помощью метода Resolve, я получаю пустую коллекцию. Тем не менее, все работает, если я вместо того, чтобы использовать ResolveNamed метод:

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

Хотя это работает, это кажется довольно хрупким (я должен обновлять этот код, если какие-либо изменения Имени или добавить/удалить SessionFactories). Есть ли способ получить все объекты из AutoFac по типу , который включает именованные экземпляры?

+0

Возможный дубликат [autofac: Как разрешить сбор названных типов?] (Http://stackoverflow.com/questions/5779517/autofac-how-to-resolve-collection-of-named-types) – nemesv

+0

Не является дублировать. В упомянутом вопросе спрашивается, как разрешить именованные экземпляры. Я спрашиваю, как разрешать все экземпляры по типу, независимо от того, как они были зарегистрированы в контейнере (имя, ключ, анонимно). –

ответ

1

Использование Resolve<IEnumerable<ISessionFactory>>()

Смотрите Relationship Types для дальнейшей информации.

+1

Я пробовал это, но AutoFac возвращает пустой список. –

+0

Да, я не знал, что названные регистрации вели себя таким образом. Если вы делаете свои регестрации, например «Named (« name »). Как ()', тогда мой ответ будет работать, но я не знаю, приемлемо ли это в вашей ситуации. –

Смежные вопросы