我们正在将 .NET Framework 应用程序 (MVC) 迁移到 .NET Core 3 应用程序 (MVC)。我们有一个场景如下:
流程1:由Controller实例化的类
流程 2:ClassX 由 ClassY 实例化 由 Class 实例化 由 Class 实例化 由控制器 B 实例化
(Controller 和 Controller 是 MVC 项目的一部分。类 X、Y、Z、D 是 MVC 项目引用的类库的一部分。)
在旧的 .NET Framework 项目中,使用了 log4net,并使用 LogManager.GetLogger 在每个类中创建静态 ILog 对象。但ASP.NET Core使用DI原理。因此,根据我的理解,ILoggerFactory 在启动时注入到控制器 A 和 B 中。在流程 2 中,loggerFactory 可以从 ControllerB 传递到 ClassX,从 ClassX 传递到 ClassY,依此类推。
只有 ClassX 需要记录,而 Flow 2 中的其他类 Y、Z 和 D 不需要记录。
在这种情况下,是否有另一种方法可以使用 ILogger 进行日志记录,而无需更改中间类构造函数(Y、Z、D)?
不要在控制器内实例化依赖的类,而是将此责任委托给 .NET Core 内置 DI 容器 - 这将帮助您将依赖的类直接注入到所需的类。
下面的代码片段将帮助您如何在现有代码库中使用 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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)