【发布时间】:2011-12-12 10:11:02
【问题描述】:
我有将记录器传递给构造函数的习惯,例如:
public class OrderService : IOrderService {
public OrderService(ILogger logger) {
}
}
但这很烦人,所以我已经用它这个属性有一段时间了:
private ILogger logger = NullLogger.Instance;
public ILogger Logger
{
get { return logger; }
set { logger = value; }
}
这也很烦人——它并不枯燥,我需要在每节课上重复一遍。我可以使用基类,但话又说回来 - 我使用的是 Form 类,所以需要 FormBase 等。 所以我认为,暴露 ILogger 的单例会有什么缺点,所以每个人都会知道从哪里获取记录器:
Infrastructure.Logger.Info("blabla");
更新:正如 Merlyn 正确注意到的,我应该提到,在第一个和第二个示例中,我使用的是 DI。
【问题讨论】:
-
从我看到的答案看来,人们似乎没有意识到你在这两个例子中都在 injecting。你能在问题中更清楚地说明这一点吗?我添加了标签来处理其中的一些问题。
-
阅读这篇文章 Dependency Injection Myth: Reference Passing 的 cmets,作者是 Google 的 Miško Hevery,他非常擅长测试和依赖注入。他说日志记录是一种例外,除非您需要测试记录器的输出(在这种情况下使用 DI),否则单例是可以的。
标签: c# .net logging dependency-injection singleton