2013-03-18 69 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