2012-02-01 19 views
1

忙於在現有的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(); 
    } 
} 

我的理解是:

  1. 的ObjectContext的是線程安全的,並且可以跨線程在這種情況下共享。
  2. 應該在一個http請求中使用單個對象上下文。正在從各種存儲庫創建多個對象上下文來呈現頁面。
  3. objectcontext似乎沒有關閉,在http請求中的任何點處都被關閉。如果正在使用事務並且從線程提交事務而不是從頭開始事務,這可能會成爲問題。

希望對以上3點以上的任何反饋,因爲我的經驗主要基於NHibernate。

+0

我猜如果它被用在web應用程序中,每個請求都是在一個新的線程中進行的。因此,在您的控制器中,您啓動數據上下文,並在您需要用於當前控制器操作的所有存儲庫之間共享。我認爲這不會導致任何問題。這是我的想法。 – superwalnut 2012-02-01 10:00:46

回答

2

您可以實施Repository and Unit of Work模式。

+0

感謝您的回覆。我很瞭解這些模式。我只是增加了一個現有的代碼庫,更關心理解我推薦重構之前發佈的代碼中的線程問題。 – Chev 2012-02-01 09:49:14

0

考慮到IIS使用線程池來管理請求,我的解決方案是爲每個請求創建一個且只有一個ThreadStatic DataContext,並在請求結束後清除它。

public class DataContextManager 
{ 
    [ThreadStatic] 
    private static MyDataContext dataContext = null; 

    public static MyDataContext GetContext() 
    { 
     if (dataContext == null) 
     { 
     dataContext = new MyDataContext(); 
    } 
    return dataContext; 
} 


public static void Clear() 
{ 
    dataContext = null; 
} 

} 
+0

謝謝艾倫。我以前曾使用會話每個請求模式。你是否說過我發佈的示例中的代碼不是線程安全的? – Chev 2012-02-01 09:50:57

+0

示例代碼沒有顯示它是否是線程安全的。它依賴於BaseRepository。我剛剛給你一個我正在使用的建議。 :) – 2012-02-01 11:42:23