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

.NET 7中通过DI调用类时如何传递ILogger实例?

解决方案

要手动实例化WeatherForecastService并传递正确的ILogger<WeatherForecastService>实例,有以下几种符合.NET DI设计的方案,按推荐优先级排序:

方案1:直接注入目标Logger到LazyLoadedWeatherForecastService

如果LazyLoadedWeatherForecastService本身是通过依赖注入容器创建的,最直接的方式是将ILogger<WeatherForecastService>注入到它的构造函数中,后续在Create方法里直接使用:

public class LazyLoadedWeatherForecastService
{
    private readonly HttpClient _httpClient;
    private readonly ILogger<WeatherForecastService> _weatherServiceLogger;

    // 通过DI注入HttpClient和目标Logger
    public LazyLoadedWeatherForecastService(HttpClient httpClient, ILogger<WeatherForecastService> weatherServiceLogger)
    {
        _httpClient = httpClient;
        _weatherServiceLogger = weatherServiceLogger;
    }

    public WeatherForecastService Create()
    {
        // 直接传递已注入的Logger实例
        return new WeatherForecastService(_httpClient, _weatherServiceLogger);
    }
}

这种方式最贴合DI设计原则,代码清晰易维护,是首选方案。

方案2:通过ILoggerFactory创建目标Logger

如果需要动态生成不同类型的Logger,或者无法直接注入ILogger<WeatherForecastService>,可以注入ILoggerFactory,通过它生成指定类型的Logger实例:

public class LazyLoadedWeatherForecastService
{
    private readonly HttpClient _httpClient;
    private readonly ILoggerFactory _loggerFactory;

    public LazyLoadedWeatherForecastService(HttpClient httpClient, ILoggerFactory loggerFactory)
    {
        _httpClient = httpClient;
        _loggerFactory = loggerFactory;
    }

    public WeatherForecastService Create()
    {
        // 基于LoggerFactory创建WeatherForecastService对应的Logger
        var logger = _loggerFactory.CreateLogger<WeatherForecastService>();
        return new WeatherForecastService(_httpClient, logger);
    }
}

方案3:通过IServiceProvider获取Logger(兜底方案)

如果上述两种方式都不可行(比如LazyLoadedWeatherForecastService是手动实例化的),可以注入IServiceProvider,通过服务定位器模式获取Logger实例。但这种方式不推荐过度使用,会降低代码的可测试性和清晰度:

public class LazyLoadedWeatherForecastService
{
    private readonly HttpClient _httpClient;
    private readonly IServiceProvider _serviceProvider;

    public LazyLoadedWeatherForecastService(HttpClient httpClient, IServiceProvider serviceProvider)
    {
        _httpClient = httpClient;
        _serviceProvider = serviceProvider;
    }

    public WeatherForecastService Create()
    {
        // 从DI容器中获取ILogger<WeatherForecastService>实例
        var logger = _serviceProvider.GetRequiredService<ILogger<WeatherForecastService>>();
        return new WeatherForecastService(_httpClient, logger);
    }
}

内容的提问来源于stack exchange,提问作者Serge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 08:43:11