我不知道应该使用什么。我有3节课。 PasswordService
,SettingsService
,FileService
。这些类每个包含大约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);
}
}
答案 0 :(得分:2)
你班上没有任何州,所以我认为没有理由使用班级的实例。 我建议你使用静态类。
答案 1 :(得分:1)
1 - 为这些服务创建单例是正确的,因为这些似乎是处理一个特定任务。
2 - 尽可能避免静态,因为如果使用TDD并使用连续的Integration服务器进行自动单元测试,则无法有效地模拟它。
答案 2 :(得分:1)
我建议您保留Singleton,除非您使用实例或DI。 Singleton可以很容易地重构为实例,而静态类必须重新实现为非静态。此外,您可以使用测试虚拟对象替换实例,而几乎不可能替换静态实现。
例如,对于两个不同的配置文件,您可能会遇到程序必须处理多个FileConfiguration
实例的情况。 Singleton可以拆分为双实例池。
我遇到了一个DAO类,它曾经是静态的,能够连接到一个DB。我们不得不重构它,因为新的要求包括在一个程序实例中支持n> 1个数据库。
正如米哈伊尔指出的那样,仅对真正无状态的东西使用静态。静态字段中的配置文件或选定的密码哈希算法已经是状态,以及上面示例中的连接字符串是 - 即使它们在运行时可能永远不会更改。