gpt4 book ai didi

c# - 从 Class Libary .NET Core 3 中的非 Controller 类访问 ILogger

转载 作者:行者123 更新时间:2023-12-05 03:56:10 25 4
gpt4 key购买 nike

我们正在将 .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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com