0

我不知道我应该用什么。我有3节课。PasswordService, SettingsService, FileService. 这些类每个都包含大约 2 个方法。这些方法正在更多的程序集中使用。现在我将它用作单例。但我不确定我是否应该这样做。我认为一个静态类就足够了。你怎么看?

代码:

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);
    }
}
4

3 回答 3

2

你的类中没有任何状态,所以我看不出有任何理由使用类的实例。我建议您使用静态类。

于 2013-03-18T11:22:16.640 回答
1

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

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

于 2013-03-18T11:17:20.963 回答
1

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

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

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

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

于 2013-03-18T11:20:23.390 回答