2013-03-18 74 views
0

我不知道我該用什麼。我有3個班。 PasswordServiceSettingsServiceFileService。這些類每個包含大約2種方法。這些方法正在用於更多的程序集。現在我將它用作單例。但我不確定是否應該。我認爲一個靜態類就足夠了。 你覺得呢?單身或靜態 - 我應該使用什麼?

CODE:

public class PasswordService 
{ 

    private PasswordService(){} 

    private static PasswordService _instance; 

    public static PasswordService Instance 
    { 
     get { return _instance ?? (_instance = new PasswordService()); } 
    } 

    public byte[] EncryptPassword(string password) 
    { 

     var protectedPass = Encoding.UTF8.GetBytes(password); 
     return ProtectedData.Protect(protectedPass, null); 
    } 

    public string DecryptPassword(byte[] encryptedPassword) 
    { 
     var unprotectedPass = ProtectedData.Unprotect(encryptedPassword, null); 
     return Encoding.UTF8.GetString(unprotectedPass, 0, unprotectedPass.Length); 
    } 
} 
+1

該問題的答案總是相同的:這取決於。 – Nuffin 2013-03-18 11:15:03

+0

可能重複的[我應該使用單身?](http://stackoverflow.com/questions/1676296/should-i-use-a-singleton) – 2013-03-18 11:16:17

+1

我會說單身幾乎總是邪惡的。使用這些服務中的每一個的實例。最終你會得到一個更靈活的設計,你可以看到你真正的依賴。 – 2013-03-18 11:16:35

回答

2

您的班級中沒有任何狀態,所以我沒有看到任何使用班級實例的理由。 我建議你使用靜態類。

+0

這些類中沒有一個保持任何狀態。只有方法。 – JuP 2013-03-18 11:23:46

1

1 - 這是正確的,創建一個單這些服務,因爲這些都似乎是處理一個特定的任務。

2 - 儘可能避免靜態,因爲如果您使用TDD並使用連續集成服務器執行自動單元測試,則無法高效地嘲笑它。

+0

那麼它可以是一個單身或者我應該重新創建它爲靜態? – JuP 2013-03-18 11:19:02

+0

shd是單身,恕我直言 – TalentTuner 2013-03-18 11:19:53

1

我建議你保持單身人士,除非你使用實例或DI。單例可以很容易地重構爲實例,而靜態類必須重新實現爲非靜態類。而且,你可以用測試假人代替實例,而替換靜態實現幾乎是不可能的。

例如,您可能會遇到一種情況,即您的程序必須處理多個FileConfiguration實例,用於兩個不同的配置文件。一個單例可以分成兩個實例池。

我遇到了一個DAO類,它曾經是靜態的,能夠連接到一個數據庫。我們不得不重構它,因爲一個新的需求包括在一個程序實例中支持n> 1個數據庫。

正如米哈伊爾指出的那樣,只使用靜態的確實是無狀態的東西。在靜態字段中的配置文件或選擇的密碼散列算法已經是狀態,以及上例中的連接字符串 - 即使它們在運行時可能永遠不會改變。

+0

但我不認爲,我保持任何狀態。這些方法只返回結果。這些課程沒有任何領域。 – JuP 2013-03-18 11:27:14

+1

@JurajP至於'PasswordService'你是對的,技術上沒有任何狀態。但是,例如'EncryptPassword'和'DecryptPassword'是相互關聯的,因爲它們共享使用'Encoding.UTF8'。在這裏以及您的其他服務中,這可能會變成像readonly Encoding enc = Encoding.UTF8'這樣的狀態,以便更容易且更容易出錯的重構。我承認這聽起來很牽強,但我後悔了一些我在過去所做的靜態方法,它們不是無狀態的,技術上彼此不相關。希望我表達得很好...... :) – 2013-03-18 11:37:12