c# - 带有 Singleton Logger 类的 DI/IoC

标签 c# .net design-patterns singleton

我们正在使用一个内部简单的 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/

相关文章:

c# - 抛出异常 : 'System.OutOfMemoryException' in ZeroMQ. dll

c# - 事件内部 : In .net 事件在内部是如何表示的?

asp.net - 将多个模型从一个 View 传递到 Controller

c++ - "Curiously Recurring Template Pattern"的实际用途

shell - help - sed - 在任何 XxxXxx 形式的字符串之间插入空格,而不替换模式

c# - 如何在任何事件触发后保持浏览器滚动位置

c# - 在 C#/ASP.NET 中是否有一种简单的方法来验证用户输入是一个 URL 以防止 XSS 攻击?

.net - Azure:HttpContext.Current.Session 对象是否由所有 WebRole 实例共享?

javascript - nodejs 的 pubsub 设计模式

c# - Entity Framework - 只更新不为空的值