单身或静态 - 我应该使用什么?

时间:2013-03-18 11:13:04

标签: c#

我不知道应该使用什么。我有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);
    }
}

3 个答案:

答案 0 :(得分:2)

你班上没有任何州,所以我认为没有理由使用班级的实例。 我建议你使用静态类。

答案 1 :(得分:1)

1 - 为这些服务创建单例是正确的,因为这些似乎是处理一个特定任务。

2 - 尽可能避免静态,因为如果使用TDD并使用连续的Integration服务器进行自动单元测试,则无法有效地模拟它。

答案 2 :(得分:1)

我建议您保留Singleton,除非您使用实例或DI。 Singleton可以很容易地重构为实例,而静态类必须重新实现为非静态。此外,您可以使用测试虚拟对象替换实例,而几乎不可能替换静态实现。

例如,对于两个不同的配置文件,您可能会遇到程序必须处理多个FileConfiguration实例的情况。 Singleton可以拆分为双实例池。

我遇到了一个DAO类,它曾经是静态的,能够连接到一个DB。我们不得不重构它,因为新的要求包括在一个程序实例中支持n> 1个数据库。

正如米哈伊尔指出的那样,仅对真正无状态的东西使用静态。静态字段中的配置文件或选定的密码哈希算法已经是状态,以及上面示例中的连接字符串是 - 即使它们在运行时可能永远不会更改。