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

标签 c# asp.net-core .net-core

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

相关文章:

c# - 如何在 Visual Studio 2008 中自动发布网站?

c# - 如何在 .NET Core 3.1 应用程序中添加 WCF 服务引用?

c# - 将数据从 View 传递到 Controller asp.net core razor 页面

c# - 如何在 .Net Core MVC 中为 Azure SignalR 调用 CosmosDBTrigger 和 HttpResponseMessage?

c# - Lightinject 中的 FluentValidation

c# - 如何将函数或字符串存储为字典中的值 (C#)

asp.net-core - 为什么我在回滚后在 SaveChanges 上收到 DbUpdateConcurrencyException

c# - 将 CSV 文件从 Angular7 传递到 MVC .Net Core

c# - 运行一个异步任务至少需要多少个线程?

c# - 初始化数组时出现 StackOverflow 异常