2010-02-17 66 views
9

在我的ASP.NET MVC應用程序中,我有一個包含所有業務邏輯/服務層的項目。該項目與位於單獨項目中的我的數據庫(實體框架)交互。應用程序服務層作爲靜態類

我希望能夠輕鬆訪問服務層,所以我在其中創建了靜態類,以便可以輕鬆地引用它們。例如,如果我在我的控制,我需要創建一個新帳戶:

ServiceLayer.Accounts.CreateAccount(userName, passWord) //etc.. 

服務層則沒有所有必需的邏輯,然後創建通過在DatabaseLayer庫中的用戶。

private static AllRepos _Repos; 
    private static AllRepos Repos { 
     get 
     { 
      if(_Repos == null) 
       _Repos = new AllRepos(); 

      return _Repos 
     } 
    } 

    public static void CreateAccount(string username, password) 
    { 
     string salt = GenerateSalt(); 
     Account newAccount = DatabaseLayer.Models.Account 
       { 
       Name = username, 
       Password = HashPassword(password, salt), 
       Salt = salt 
       }; 
     Repos.AddAccount(newAccount);  
    } 

因爲我不想做到處都在我的服務層以下:

AccountRepository Accounts = new DatabaseLayer.AccountRepository(); 

我,而不是創建一個包裝類爲我的倉庫,這樣我只需要實例化一次使用所有其他倉庫。

public class AllRepos 
{ 

    private AccountRepository _Accounts; 

    public AccountRepository Accounts 
    { 
     get 
     { 
      if (_Accounts== null) 
       _Accounts= new AccountRepository(); 

      return _Accounts; 
     } 
    } 

    // the same is done for every other repository (currently have about 10+) 
    } 

它被用在服務層的靜態類中。

因爲我所有的服務層類都是靜態的,並且Repos字段也是靜態的,所以我一直遇到的明顯問題是從多個數據上下文中檢索同一對象,從而導致更新/刪除的奇怪行爲。

據我所知,如果我像使用靜態成員/類一樣使用靜態成員/類是因爲它們持續了應用程序的生命週期,但是有沒有辦法可以使用服務層而不必創建ServiceLayer.Accounts.Method()一個非靜態類,需要在使用它的任何地方實例化,並且由於多個datacontext實例而不會遇到CRUD問題?

+0

「事實上,一些最好的幫手方法是靜態的」你最好的概念是什麼? – 2010-11-09 02:58:02

回答

15

您的方法實際上不是推薦的方法。就我個人而言,我絕不會允許我的團隊使用這種方法。缺點:

  1. 主要線程問題,您所遇到,這不是簡單的解決
  2. 您不能對此進行測試很容易的。
  3. 的數據訪問

的最大原因創建庫的情況下,不切實際的抽象是這樣,如果你需要,你可以注入的依賴關係。最着名的論點是單元測試,因此您可以模擬依賴關係,但是我已經構建了一些存儲庫,這些存儲庫的生產代碼中有接口依賴關係。

您應該簡單地將您的存儲庫實例化作爲您的基本服務類的一部分。沒有任何理由,它必須是「靜態的實例調用無處不在」。基類中應該有有限的實例實例化代碼。

+0

還想補充一點,當我在控制器和服務之間使用靜態類時遇到了升級到MSDTC的問題 – DevDave 2012-02-21 13:20:46

10

我不知道你爲什麼如此死定了使用實例。除了現在的代碼不必要的複雜之外,使用靜態類型還會使單元測試更加困難。靜態類型就像一個你不能模擬/替換的單例。在我看來,你真正的問題可能是,「我如何終身管理我的服務層實例?」通常情況下,您通過爲每個Web請求創建一個實例來完成此操作在ASP.NET MVC應用程序中,您可以new up a DI container via a ControllerFactory, and handle all of this. [PDF]

1

您需要處理您的ObjectContext的範圍一字一板地,像這樣做一個Unit Of Work pattern

除此之外,我認爲你應該重新考慮做的一切靜態,作爲womp說你得到很高的耦合,以及使測試變得非常困難,並且您可以通過使用IOC容器來管理依賴圖的很多幫助。

我可以這樣說,已經燒燬自己做這樣的事以前:)

-3

單身(和描述靜態類)是邪惡的,應在特別是在Web應用程序一切代價避免。

+0

我不同意這一點,當靜態方法時Helper方法是理想的。事實上,一些最好的輔助方法對於Web的使用是靜態的。請求,Server.MapPath,文件/目錄等... – Mike 2010-05-20 20:55:07

相關問題