使用依赖注入的 ILogger<T> 的基类类型

Cha*_*d K 9 c# dependency-injection .net-core

我有一个执行一些工作的基类,包括日志记录。我在构造函数中注入了一个 ILogger 依赖项

public abstract class BaseClassExample
{
    protected readonly ILogger<BaseClassExample> logger;

    public class BaseClassExample(ILogger<BaseClassExample> logger)
    {
        this.logger = logger;
    }
}

Run Code Online (Sandbox Code Playgroud)

我想让类实现 BaseClassExample,并且也做自己的工作,包括日志记录。

public class DerivedClass : BaseClassExample
{
    protected readonly ILogger<DerivedClass> logger;

    public class BaseClassExample(ILogger<DerivedClass> logger)
    {
        this.logger = logger;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是做事的正确方式吗?我应该获取实现类的类型来记录基类吗?我应该有一个单独的记录器实例(使用 DerivedClass 的类型)还是尝试使用与基类相同的实例?

F_I*_*I_L 11

在基类中使用非通用 ILogger,但ILogger<DerivedClass>在派生类中使用。通过这种方式,您可以根据需要简单地将 ILogger 传递给您的基类:

public abstract class BaseClassExample
{
    private readonly ILogger logger;

    public class BaseClassExample(ILogger logger)
    {
        this.logger = logger;
    }
}
Run Code Online (Sandbox Code Playgroud)

public class DerivedClass : BaseClassExample
{
    private readonly ILogger<DerivedClass> logger;

    public class BaseClassExample(ILogger<DerivedClass> logger)
                  :base(logger)
    {
        this.logger = logger;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,如果您以某种方式最终得到两个派生类,您不仅可以更轻松地使用它,还可以在它们两个中使用 ILogger。

  • @ChadK 在基类中将“logger”设置为“protected”,并从派生类中删除“logger”字段。 (2认同)