2013-08-19 148 views
2

我在ASP.NET MVC應用程序中使用Castle Windsor作爲我的IoC以及NHIbernate。它很好的註冊如下:Castle Windsor/NHibernate/FactoryMethod並註冊NHIbernate EmptyInterceptor

container.Register(Component.For<ISessionFactoryBuilder.().ImplementedBy<SessionFactoryBuilder>().LifestyleSingleton()); 

// Register the NHibernate session factory as a singleton using custom SessionFactoryBuilder.BuildSessionFactory method. 
container.Register(Component.For<ISessionFactory>().UsingFactoryMethod(k => k.Resolve<ISessionFactoryBuilder>().BuildSessionFactory("ApplicationServices")).LifestyleSingleton()); 

container.Register(Component.For<ISession>().UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession()).LifestylePerWebRequest()); 

但是,我想介紹一個NHibernate的IInterceptor爲了提供簡單的審計。通常我使用了一個NHibernate會話管理器,在這個會話管理器中很容易傳入攔截器,因爲SessionFactory.OpenSession(...)通常會在Begin_Request中調用,而不是在組件註冊期間(在App_Start中)。不幸的是,LifestylePerWebRequest模塊不能在該點訪問,從而爲即下可以理解的失敗:

container.Register(Component.For<IInterceptor>().ImplementedBy<ChangeAuditInfoInterceptor>().LifestylePerWebRequest()); 
var interceptor = container.Resolve<IInterceptor>(); 
     container.Register(Component.For<ISession>().UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession(interceptor)).LifestylePerWebRequest()); 

什麼是引入一個NHibernate的攔截器(通常以SessionFactory.OpenSession插入(最好的辦法?IInterceptor)使用此方法NHibernate的會話管理溫莎城堡

+1

可能是一個(真的)愚蠢的評論,但是如果移動container.Resolve ()在lambda中,而不是OpenSession的攔截器參數,那麼執行是否會延遲到正確的時間? – jbl

+0

那麼,爲什麼我沒有意識到這一點!?謝謝。我確實通過在我的SessionBuilder中注入我的IInterceptor並通過Configuration.SetInterceptor(_interceptor)將它添加到我的NHibernate配置中來實現它。然而,將它放在它通常通過container.Register(Component.For ().UsingFactoryMethod(k => k.Resolve ()。)OpenSession(container.Resolve ()))的地方很好。 LifestylePerWebRequest());把你的答案作爲答案,我會將其標記爲這樣。 – Ted

+0

然而,我已經遇到了另一個問題,我應該把它作爲一個單獨的問題,但是因爲我的ChangeAuditInterceptor反過來使用一個服務,它具有對NHibernate ISession的依賴(獲取用戶信息),所以我得到了循環依賴: – Ted

回答

0

正如評論指出時,你應該把代碼來實例化你的攔截器在lambda這樣,代碼將執行在正確的時間:

container.Register(Component.For<ISession>() 
          .UsingFactoryMethod(k => k.Resolve<ISessionFactory>() 
           .OpenSession(container.Resolve<IInterceptor>())) 
          .Lif‌​estylePerWebRequest()); 
相關問題