我们正在将 .NET Framework 应用程序 (MVC) 迁移到 .NET Core 3 应用程序 (MVC)。我们有一个场景如下:
流程 1:ControllerA 实例化 ClassX
流程 2:ClassX 实例化 ClassY 实例化 ClassZ 实例化 ClassD 实例化 ClassD 实例化 Controller B
(ControllerA 和 ControllerB 是 MVC 项目的一部分。类 X、Y、Z、D 是 MVC 项目引用的类库的一部分。)
在旧的 .NET Framework 项目中,使用 log4net 并使用 LogManager.GetLogger 在每个类中创建静态 ILog 对象。但是 ASP.NET Core 使用的是 DI 原理。因此,根据我的理解,ILoggerFactory 在启动时被注入(inject)到 Controller A 和 B 中。在流程 2 中,loggerFactory 可以从 ControllerB 传递到 ClassX,从 ClassX 传递到 ClassY 等等。
只有 ClassX 需要日志记录,而不是 Flow 2 中的其他类 Y、Z 和 D。
在这种情况下,是否有另一种方法可以在不更改中间类构造函数(Y、Z、D)的情况下使用 ILogger 进行日志记录?
最佳答案
与其在 Controller 中实例化依赖类,不如将此职责委托(delegate)给 .NET Core 内置 DI 容器 - 这将帮助您将依赖类直接注入(inject)所需类。
下面的代码片段将帮助您如何在现有代码库中使用 DI。
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
services.AddLogging();
services.AddTransient<ClassX>();
services.AddTransient<ClassY>();
services.AddTransient<ClassZ>();
services.AddTransient<ClassD>();
...
}
}
public class ControllerB : ControllerBase
{
private readonly ClassD classD;
private readonly ILogger logger;
public ControllerB(ClassD classD, ILogger<ControllerB> logger)
{
this.classD = classD;
this.logger = logger;
}
...
}
public class ClassD
{
private readonly ClassZ classZ;
public ClassD(ClassZ classZ)
{
this.classZ = classZ;
}
} //Do the same thing for ClassZ and ClassY
public class ClassX
{
private readonly ILogger logger;
public ClassX(ILogger<ClassX> logger)
{
this.logger = logger;
}
}
关于c# - 从 Class Libary .NET Core 3 中的非 Controller 类访问 ILogger,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59711887/