.NET 8控制台应用中嵌套类如何通过DI获取ILogger与IConfiguration
.NET 8控制台应用多层嵌套类的依赖注入解决方案
问题根源
你直接手动实例化NestedClass(原SubClass)时,既没有传入构造函数要求的ILogger和IConfiguration参数,又脱离了DI容器的管理,自然无法自动获取依赖。要实现类似ASP.NET Core的构造注入效果,所有需要依赖的类都必须注册到DI容器,由容器负责解析并注入所有依赖项。
具体实现步骤
1. 规范NestedClass的构造函数依赖声明
调整NestedClass的构造函数,使用自身对应的ILogger<NestedClass>(每个类建议使用专属日志实例,避免混淆日志上下文)和IConfiguration作为参数:
public class NestedClass { private readonly ILogger<NestedClass> _logger; private readonly IConfiguration _config; public NestedClass(ILogger<NestedClass> logger, IConfiguration config) { _logger = logger; _config = config; } // 示例业务方法,使用注入的依赖 public void ExecuteNestedTask() { _logger.LogInformation("NestedClass开始执行任务"); var configValue = _config["AppSettings:DemoValue"]; _logger.LogInformation("读取到配置值:{ConfigValue}", configValue); } }
2. 在Program.cs中注册所有需要DI的类
将Runner和NestedClass都注册到DI容器,根据业务场景选择合适的生命周期(Transient/Scoped/Singleton):
var builder = Host.CreateDefaultBuilder(args); builder.ConfigureServices(services => { // 注册Runner,示例使用Transient生命周期(每次获取都创建新实例) services.AddTransient<Runner>(); // 注册NestedClass services.AddTransient<NestedClass>(); }); var host = builder.Build(); // 从容器获取Runner实例并执行 var runner = host.Services.GetRequiredService<Runner>(); await runner.RunAsync(); await host.RunAsync();
3. 在Runner中通过构造注入接收NestedClass
不要在Runner内手动new NestedClass(),而是让DI容器把NestedClass注入到Runner的构造函数中:
public class Runner { private readonly ILogger<Runner> _logger; private readonly IConfiguration _config; private readonly NestedClass _nestedClass; // 构造注入NestedClass及自身依赖 public Runner(ILogger<Runner> logger, IConfiguration config, NestedClass nestedClass) { _logger = logger; _config = config; _nestedClass = nestedClass; } public async Task RunAsync() { _logger.LogInformation("Runner启动执行"); // 调用嵌套类的业务方法 _nestedClass.ExecuteNestedTask(); await Task.CompletedTask; } }
关键注意事项
- DI容器会自动递归解析依赖链:比如Runner依赖NestedClass,NestedClass依赖
ILogger<NestedClass>和IConfiguration,容器会自动创建并注入所有层级的实例,无需手动处理。 ILogger<T>和IConfiguration是.NET Host默认提供的内置服务,无需手动注册,直接在构造函数中声明即可使用。- 生命周期选择建议:
Transient适合无状态的工具类,Scoped适合单次请求/任务内的复用,Singleton适合全局共享的资源类,根据业务需求选择。
通过以上方式,就能实现多层嵌套类的依赖注入,无需在每个类中重复配置,逻辑与ASP.NET Core控制器的构造注入完全一致。
内容的提问来源于stack exchange,提问作者BBrowsk6605
相关产品推荐
相关产品推荐

