2012-11-23 81 views
1

我正在構建一個ASP.NET MVC網站,其WCF webservice後端通過NHibernate與數據庫交談。目前作爲POC我有一個名爲UserService的Web服務,它包含我需要的所有方法。我遇到的問題是我有一個包裝NHibernate配置的DataRepository對象。當我創建一個新的數據存儲庫對象時,它會加載NHibernate配置和映射以及緩存等。對於用戶會話中的我的網站,我想讓這個DataRepository對象在其會話期間保持打開狀態,因爲它沒有任何意義在每個調用的基礎上重新配置NHibernate,並且我希望所有webservice方法都可以使用相同的數據存儲庫,以從NHibernate緩存中受益。ASP.NET與Web服務,NHibernate會話設計

這裏的答案是在UserService.cs類級別創建一個靜態DataRepository對象,並將該網站配置爲在每個會話基礎上實例化,這是否意味着每個用戶會話都包含它自己的靜態Dataarepository對象他們的會議?或者,還有更好的方法?有沒有我沒有想到用上述方法?

回答

1

我會建議一個更好的方法。不要共享資源庫,共享hibernate的會話並將其注入資源庫。

public class DataRepository { 
    public DataRepository (Session session) { 
    } 
} 

通過這種方式,您可以精確地控制存儲庫和會話的壽命。特別是,你可以有一個共享會話(在請求範圍內),但總是創建一個新的(臨時)存儲庫。

+0

感謝您的回覆。你會在哪裏創建和存儲對NHibernate會話的引用? – NZJames

+0

就我個人而言,我會在注入工廠和會話生存期管理器中使用IoC容器。大多數IoC容器都可以做到這一點。如果你不使用或不想使用它,你可以使用'CurrentSessionContext.Bind'(http://dotnetslackers.com/articles/aspnet/Configuring-NHibernate-with-ASP-NET.aspx)或者甚至將會話存儲在您自己的'HttpContext.Current.Items'容器中。 –