.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
相关产品推荐
相关产品推荐

