2010-09-30 68 views
0

我用這個approuch http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/設立FNH與structuremap但一個請求後,我得到下面的異常設置功能NHibernate和StructureMap爲Web應用程序

會話關閉! 對象名稱:'ISession'。

描述:執行當前Web請求期間發生未處理的異常。請查看堆棧跟蹤以獲取有關該錯誤的更多信息以及源代碼的位置。

異常詳細信息:System.ObjectDisposedException:會話已關閉! 對象名稱:'ISession'。

我的倉庫類看起來是這樣的:

public class Repository : IRepository { 
    private readonly ISession _session; 
    public Repository(ISession session) { 
     _session = session; 
    } 
    public T Get<T>(Expression<Func<T, bool>> predicate) { 
     return _session.CreateCriteria(typeof(T)).Add(predicate).UniqueResult<T>(); 
    } 

和我登記我的倉庫中structuremap這樣的:

public class RepositoryRegistry : Registry { 
    public RepositoryRegistry() { 
     Scan(a => { 
      a.AssembliesFromApplicationBaseDirectory(); 
      a.AddAllTypesOf<IRepository>(); 
     }); 
    } 
} 

我怎樣才能防止被關閉會話?

回答

0

您是否像在示例中那樣註冊您的ISession?應該HttpContext的範圍的,像這樣:

 x.For<ISession>() 
     .HttpContextScoped() 
     .Use(context => context.GetInstance<ISessionFactory>().OpenSession()); 

另一種可能性是,事情是越來越註冊爲單身(並持有到一個閉門會議,而不是與當前會話正在重建

後。看到您的問題StructureMap名單:http://groups.google.com/group/structuremap-users/browse_thread/thread/8023e0acc43ceeb3#,我看這個問題

你注入你的資料庫到站點地圖中,這是一個單身所以,你需要給地圖一個新的會話的每個請求,像這樣:。

public class MvcSiteMapProvider : SiteMapProvider { 
    public static IRepository Repository { get; set; }; 
    public MvcSiteMapProvider() { } 
} 

protected void Application_BeginRequest() { 
    MvcSiteMapProvider.Repository = ObjectFactory.GetInstance<ISession>(); 
} 
+0

是的,ISession的註冊看起來完全一樣。唯一註冊爲Singleton的是ISessionFactory,雖然它與示例中的相似。你有什麼想法,我可以開始尋找一個錯誤? – Marcus 2010-10-01 05:32:48

+0

嗯,這很奇怪,你可以看看ObjectFactory.WhatDoIHave()的輸出,看看它是否看起來像是正確註冊的。某些東西的範圍必須錯誤,或者您明確地在某個地方關閉會話。 – 2010-10-01 17:21:26

+0

該錯誤似乎發生在我的sitemapprovider。因爲構造函數必須具有一個空的默認構造函數,所以我在構造函數中使用ObjectFactory.GetInstance (),這似乎是問題所在? public class MvcSiteMapProvider:SiteMapProvider {0}私有IRepository _repository; public MvcSiteMapProvider(){ _repository = ObjectFactory.GetInstance (); } } – Marcus 2010-10-03 20:28:21