6

我對我的DAL使用Linq to SQL,並且聽說過有關在Web應用程序中使用靜態方法的各種信息(關於線程/併發問題)。目前,我創建了一個測試DAL,這似乎運行良好。但是,我創建它的方式是否有問題,因爲它是靜態的?適用於Linq To SQL DAL的靜態方法是什麼?

public static class TestDAL 
    { 


     public static bool GetUserAddress(string username) 
     { 
      testDBDataContext dbContext = new testDBDataContext(); 
      //Linq code goes here 

     } 


     public static void InsertUserNumber(int userID) 
     { 
      testDBDataContext dbContext = new testDBDataContext(); 
      //... 
      dbContext.UserDetails.InsertOnSubmit(nUser); 
      dbContext.SubmitChanges(); 

     } 

     //etc... All the methods are created in the same way 


    } 

此方法適用於Web應用程序,還是會在生產環境中出現問題?

謝謝。

+0

你聽說過什麼關於線程/併發性的東西? – ScottE 2010-02-10 17:18:43

+0

@ScottE:我從來沒有聽過任何細節(部分爲什麼我決定在這裏問),但我記得看到一篇文章聲稱可能存在一個問題,即一個用戶的數據與其他人混在一起,因爲他們訪問過DAL方法。 – Skoder 2010-02-10 17:34:01

回答

5

只要您的靜態方法不使用任何共享狀態(類級別狀態或其他全局狀態),它們本身不會導致在多線程環境中運行的任何問題。每個靜態方法調用將創建它自己的局部變量的副本。

+0

@Jeff:謝謝你的回覆。不,在這方面,這些方法非常獨立。我只記得看到一些L2S文章,他們似乎有一個非靜態類,只有一個DataContext實例(其他方法使用它)。我只是想確保我的方法,每個方法創建新的DataContexts,不會有問題。 – Skoder 2010-02-10 17:36:16

+0

對不起,忘了問。如果一個方法調用另一個方法,那麼它會被視爲共享的變量(哪個方法也可以單獨調用)?或者每個方法是否仍然創建自己的局部變量? – Skoder 2010-02-10 17:42:25

+1

只要兩個方法只使用局部變量(和方法參數),靜態方法就可以相互調用而不引起線程問題。 要了解在多線程環境(如Web應用程序)中運行時會遇到什麼問題以及出現什麼問題,我推薦閱讀Joseph Albahari的經常推薦的「C#中的線程處理」(http://www.albahari。 com/threading /)和Jon Skeet的「.NET中的多線程」(http://www.yoda.arachsys.com/csharp/threads/)。 – 2010-02-10 19:10:50

3

就我個人而言,我會避免靜態方法,因爲它會使這些代碼更難測試。測試使用它的代碼時,您將無法輕鬆地嘲笑DAL。請注意,這不是LINQ或數據訪問層所特有的,它只是代碼的一個功能,而不是實例方法。

+0

@tvanfosson:感謝您的建議。目前這個項目很小,所以測試不是決定性因素。但是,在處理大型項目時,我一定會考慮實例方法。 – Skoder 2010-02-10 17:40:25

2

從你提供的代碼片段可以看出,各種方法的作用並不十分清楚。我看到它的方式,只要你使用局部變量,它是安全的。

+0

@Darin:謝謝你的回覆。其他方法非常通用,但它們都不共享任何全局變量。 – Skoder 2010-02-10 17:42:59