You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 14:37:17