如何在控制台应用中通过依赖注入在自定义类中使用日志记录器
控制台应用中给自定义类注入日志记录器的实现方法
你完全可以用依赖注入(DI)的方式实现,和Azure Functions的思路一致,具体步骤如下:
1. 添加依赖注入包
首先需要安装Microsoft.Extensions.DependencyInjection NuGet包,这是.NET官方的DI容器实现。
2. 重构Program.cs,配置DI容器
把原来的日志工厂配置整合到DI容器中,同时注册你的自定义类:
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; // 配置DI容器 var services = new ServiceCollection(); // 注册日志服务 services.AddLogging(builder => { builder .AddFilter("Microsoft", LogLevel.Warning) .AddFilter("System", LogLevel.Warning) .AddConsole(); }); // 注册自定义Test类(这里用瞬时生命周期,可根据需求调整) services.AddTransient<Test>(); // 构建服务提供者 using var serviceProvider = services.BuildServiceProvider(); // 从容器中获取Test实例(此时日志已自动注入) var test = serviceProvider.GetRequiredService<Test>();
3. 修改Test类,通过构造函数注入日志
把日志记录器通过构造函数注入,就像Azure Functions里的方式:
internal class Test { private readonly ILogger<Test> _logger; // 构造函数注入ILogger<Test> public Test(ILogger<Test> logger) { _logger = logger; _logger.LogInformation("Calling Test"); } }
补充:不使用DI的简易方式
如果不想引入DI容器,也可以直接在创建Test实例时手动传入日志实例:
// 在Program.cs中 var logger = loggerFactory.CreateLogger<Test>(); var test = new Test(logger); // 修改Test类构造函数 internal class Test { private readonly ILogger<Test> _logger; public Test(ILogger<Test> logger) { _logger = logger; _logger.LogInformation("Calling Test"); } }
但推荐使用DI的方式,尤其是当项目中有多个类需要日志或其他服务时,DI能更好地解耦代码、管理实例生命周期。
内容的提问来源于stack exchange,提问作者Lamar
相关产品推荐
相关产品推荐

