忙於在現有的Web應用程序上執行一些工作,並擔心在BaseRepository類中使用ObjectContext的線程安全性。這是導致我的蜘蛛俠感覺發麻的代碼是:Web應用程序中的Linq to SQL ObjectContext - 線程安全問題
// within base repository
private SiteDataContext context;
public SitepDataContext Context
{
get
{
if (context == null)
context = new SiteDataContext();
return context;
}
}
// inherited repository
public class InheritedRepository1 : BaseRepository
{
public SomeEntity Get()
{
var something = Context.SomeEntity.First();
}
}
public class InheritedRepository2 : BaseRepository
{
public SomeOtherEntity Get()
{
var something = Context.SomeOtherEntity.First();
}
}
我的理解是:
- 的ObjectContext的是不線程安全的,並且可以跨線程在這種情況下共享。
- 應該在一個http請求中使用單個對象上下文。正在從各種存儲庫創建多個對象上下文來呈現頁面。
- objectcontext似乎沒有關閉,在http請求中的任何點處都被關閉。如果正在使用事務並且從線程提交事務而不是從頭開始事務,這可能會成爲問題。
希望對以上3點以上的任何反饋,因爲我的經驗主要基於NHibernate。
我猜如果它被用在web應用程序中,每個請求都是在一個新的線程中進行的。因此,在您的控制器中,您啓動數據上下文,並在您需要用於當前控制器操作的所有存儲庫之間共享。我認爲這不會導致任何問題。這是我的想法。 – superwalnut 2012-02-01 10:00:46