2011-03-09 50 views
9

我使用Ninject和NHibernate的ASP.NET MVC 3。將Ninject調用處置並關閉NHibernate Isession?

當DI的思考,我認爲誰得到資源的一個還確保將其關閉(在這種情況下Ninject應該負責)

但我不知道使用InRequestScope時Ninject是如何工作的。

我的代碼是:

Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope(); 

我打開一個會話,並把它放在我InRequestScope,但Ninject採取關閉我的ISession的時候纔出請求範圍?

+0

你能解釋這是怎麼區別的http://stackoverflow.com/questions/5221620/nhibernate-dependency-injection-close-isession-適當請和/或考慮關閉這個 - 這個quesxztion有很多dups這就是爲什麼他們沒有一個適當的答案海事組織? – 2011-03-09 09:42:36

+0

你提到的問題有兩個矛盾的答案,我在這裏得到了很好的答案,但現在它被刪除了嗎?也許你呢? – Luticka 2011-03-09 12:06:44

+0

@Lutica:問題是至少有2個半問題+答案。 @Darin刪除了他作爲維護者之一(@Remo Gloor)指出他的答案不夠。 @Darin應該可能已經放棄並編輯了一段回憶,因爲他誤解了某些內容對於你們任何人都是一種學習體驗。如果我能夠刪除帖子,我當然不會 - 我會在答案中對其進行評論,以便修正或發佈改進版,如果沒有得到任何結果 – 2011-03-09 17:29:21

回答

7

如果我正確理解代碼,答案是肯定的。 Ninject使用的ActivationStrategies之一是DisposableStrategy,它的Deactivate方法在實現IDisposable的任何事物上調用Dispose。如果您使用的是Ninject.Web.MVC擴展,則OnePerRequestModule將自動清除綁定緩存。這將在所有ActivationStrategies上調用Deactivate方法,包括DisposableStrategy。

由於ISession實現IDisposable,它將被丟棄。 ISession的默認實現SessionImpl關閉Dispose上的會話。

如果您不使用Ninject.Web.MVC擴展,緩存最終將被清除,但可能不會在EndRequest發生。