我们正在使用一个内部简单的 Logger 类来执行我们应用程序的日志记录任务 (.NET 3.5)。
记录器代码很旧,设计类似于:
public class Logger : ILogger
{
private ILogger instance;
private static ILogger Instance
{
// Initialized on first use.
get { return instance; }
}
public static void Debug(string msg)
{
instance.Debug(msg);
}
public static void Error(string msg)
{
....
}
}
实例本身在第一次使用时被初始化(懒惰地)。
根据其严格的“按规定”实现,这不是单例,但尽管如此,所有调用代码对此类的访问都是静态访问。
出于测试目的和其他架构原因,我希望能够用其他东西替换内部实例(注入(inject)它)。
我怎样才能轻松实现这一点?我们目前没有使用任何 IoC 容器,但我不想将 setter 暴露给 Instance 属性,因为那样会破坏整个 Singleton 类设计。
关于如何为此提出解决方案有什么建议吗?
最佳答案
考虑使用 Fakes Framework用于测试目的。你可以用这样的东西来 stub 对静态方法的调用
ShimLogger.Instance = () => new LoggerMock();
如果是 .net 3.5,您可以使用 Moles Framework stub 静态方法调用。配置代码将类似于:
MLogger.Instance = () => new LoggerMock();
它需要将静态方法 Instance
公开,但在这个配置之后,对静态方法的每次调用都将返回您的模拟实例。
关于c# - 带有 Singleton Logger 类的 DI/IoC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12061527/