【发布时间】:2021-08-12 08:32:14
【问题描述】:
我正在编写一个 C# 库,并试图弄清楚如何最好地进行日志记录。我希望我的库在有和没有 DI 的情况下都可以使用。
假设我的库有一个名为Foo 的主要公共类,它通过其构造函数接受IBar 依赖项,但也有一个类型为Qux 的硬连线私有成员(一个内部类)。
为了使我的库日志框架不可知,我认为最佳实践是将ILogger<Foo> 传递给Foo 的构造函数,并将ILogger<BarImpl> 传递给IBar 的实现。
我的问题是,Qux 应该使用 ILogger<Foo> 记录器,还是应该有自己的记录器 ILogger<Qux>?如果是这样,Foo 将如何创建一个ILogger<Qux> 以传递给Qux?
public interface IBar {}
public class BarImpl : IBar
{
public BarImpl(ILogger<BarImpl> logger)
{
}
}
internal class Qux
{
public Qux(ILogger<Qux> logger) // should Qux accept ILogger<Qux> or ILogger<Foo>?
{
}
}
public class Foo
{
private Qux _qux;
public Foo(IBar bar, ILogger<Foo> logger)
{
// how to create ILogger<Qux> here?
// _qux = new Qux();
}
}
【问题讨论】:
-
你不能把
Qux也注入Foo,让容器自己解决吗? -
谢谢你,两位记录者是指
ILogger<Foo>和ILogger<Qux>吗? -
@Llama
Qux是一个内部类,我想对Foo的用户隐藏它。它应该被视为一个实现细节。 -
正如@CamiloTerevinto 所说,
ILoggerFactory是您应该使用的基础设施类型代码。 -
静态依赖解决是一件很痛苦的事情,因为你到处都有隐藏的依赖。在查看类签名时,无法知道内部的日志记录系统存在隐藏的依赖关系以及它是如何工作的。根据我的经验,隐藏的依赖关系会在你最意想不到的时候回来咬你。
标签: c# .net logging dependency-injection ilogger