2011-06-20 92 views
2

使用windsor,設施和nhibernate配置應用程序時遇到問題。使用Windsor和NHibernate配置應用程序的Asp MVC問題

即時得到此異常:

ObjectDisposedException: Session is closed 

不應該溫莎照顧每個請求打開它實例化會話時,我有這樣的配置呢?我可以錯過一些配置嗎? 這是我的confuguration:

public class PersistenceFacility : AbstractFacility 
{ 

    protected override void Init() 
    { 
     Configuration config = BuildDatabaseConfiguration(); 

     Kernel.Register(
      Component.For<ISessionFactory>() 
       .LifeStyle.Singleton 
       .UsingFactoryMethod(config.BuildSessionFactory), 
      Component.For<ISession>() 
       .LifeStyle.PerWebRequest 
       .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())); 
    } 

    private Configuration BuildDatabaseConfiguration() 
    { 
     return Fluently.Configure() 
      .Database(SetupDatabase) 
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<RnUlice>()) 
      .ExposeConfiguration(ConfigurePersistence) 
      .BuildConfiguration() ; 
    } 
    ...... 
} 
+0

滿堆跟蹤請。 –

+0

在哪個執行點你會得到異常? –

+0

我加載頁面,我有搜索框我嘗試搜索的東西,我得到這個異常。請注意當我刪除LifeStyle.PerWebRequest 會話時,一切正常(但我需要每個請求的會話) – Eduard

回答

7

如果您的Repository<T>在其構造函數中獲得了一個ISession,並且它是單例(默認生活方式),那麼它只會在第一次調用您的存儲庫的請求中起作用。在隨後的請求中,存儲庫將仍然具有與第一次調用相同的ISession(因爲存儲庫是單例),但該會話現在已關閉且無法使用,因此會出現錯誤。

這就是爲什麼大多數時候你不希望單身人士依賴於其他具有「更短」生活方式的組件(如每個網絡請求或瞬態)。

請參閱this article以更全面地分析常見的生活方式問題。

+0

現在有道理的Thanx +1 – Eduard

2

我想通了什麼是錯的。我忘記將我的存儲庫生活方式配置爲Transient。雖然我不太明白這是一個問題。

  container.Register(Component.For(typeof(IRepository<>)) 
            .ImplementedBy(typeof(Repository<>)).LifeStyle.Transient); 

我在想什麼是默認的生活方式呢?我正在閱讀文件,它是單身??這怎麼可能是一個問題?

+1

這是一個問題,因爲你的ISession是每個網頁請求,但在此之後很長一段時間你會保持你的回購。因此,生活方式關閉了ISession,但回購試圖嘗試使用它。 – Henrik

+0

我有這個確切的問題。謝謝 –