【发布时间】:2011-03-15 12:59:47
【问题描述】:
我正在更新一个绝对充斥着 Singleton 类的遗留应用程序。一个完美的例子是 SnmpConnector 类:
public SnmpConnector
{
public static IEnumerable<string> HostIpAddresses
{
...
}
private static SnmpConnector instance;
public static SnmpConnector Instance
{
if (instance == null)
instance = new SnmpConnector();
return instance;
}
private SnmpConnector()
{
foreach (string IpAddress in HostIpAddresses)
{
...
}
}
...
}
此更新的目标是提高代码库的可测试性,因此我想摆脱单例。我已经抽象出 SnmpConnector 的数据源,以便从测试数据库或查询实时服务器获取数据:
public interface ISnmpDataSource
{
public DataTable MacTable
{
get;
private set;
}
public DataTable PortTable
{
get;
private set;
}
...
}
public TestSnmpDataSource : ISnmpDataSource
{
public FileInfo DataSource
{
get;
private set;
}
...
}
public SnmpDataSource : ISnmpDataSource
{
public List<string> HostIpAddresses
{
get;
private set;
}
...
}
public SnmpConnector
{
public SnmpConnector(ISnmpDataSource DataSource)
{
...
}
...
}
现在,我正在尝试测试这些组件并遇到了可能导致 SnmpConnector 成为单例的问题:测试 SnmpDataSource 需要花费大量时间。事实证明,从实时交换机获取 MAC 表和端口表需要 10 到 20 秒。我已经为这个特定的类编写了 13 个单元测试,因此完成这些测试需要两分钟多的时间。尽管这很烦人,但一旦这些更新发布到我们的原始代码库,情况就会变得更糟。通过这种新的重构,没有什么能阻止程序员反复创建和丢弃 SnmpDataSource。
现在,这些表中的数据大部分是静态的;旧的 Singleton 和新的 SnmpDataSource 都维护一个仅每四个小时更新一次的缓存。我是否必须将 SnmpDataSource 设为 Singleton 才能防止出现此问题?
【问题讨论】: