.NET/C#中如何在抽象工厂中正确使用ILogger<>
解决方案
方案1:注入ILoggerFactory到工厂类
这种方式灵活性最高,适合工厂需要创建多种依赖不同Logger的服务场景。通过LoggerFactory可以按需生成任意类型的Logger实例。
修改MyServiceFactory的实现:
public class MyServiceFactory : IMyServiceFactory { private readonly ILogger<MyServiceFactory> _logger; private readonly ILoggerFactory _loggerFactory; public MyServiceFactory(ILogger<MyServiceFactory> logger, ILoggerFactory loggerFactory) { _logger = logger; _loggerFactory = loggerFactory; } public IMyService CreateMyService(string something) { var myServiceLogger = _loggerFactory.CreateLogger<MyService>(); return new MyService(myServiceLogger); } }
方案2:直接注入ILogger<MyService>到工厂类
如果工厂仅负责创建MyService这一种服务,直接注入对应的Logger会更简洁。由于ILogger<T>在DI容器中默认是单例模式,重复使用不会有性能问题。
修改后的MyServiceFactory:
public class MyServiceFactory : IMyServiceFactory { private readonly ILogger<MyServiceFactory> _logger; private readonly ILogger<MyService> _myServiceLogger; public MyServiceFactory(ILogger<MyServiceFactory> logger, ILogger<MyService> myServiceLogger) { _logger = logger; _myServiceLogger = myServiceLogger; } public IMyService CreateMyService(string something) { return new MyService(_myServiceLogger); } }
Startup.cs中的注册配置
无论采用哪种方案,都需要在Startup.cs的ConfigureServices方法中完成服务注册:
public void ConfigureServices(IServiceCollection services) { // 日志服务默认已由ASP.NET Core自动注册,若手动集成需添加此句 services.AddLogging(); // 注册工厂实现 services.AddTransient<IMyServiceFactory, MyServiceFactory>(); // MyService无需在DI容器中注册,因为由工厂负责实例化 }
选择建议
- 若工厂职责单一,仅创建
MyService,优先选方案2,代码更简洁直观; - 若工厂需要创建多种不同Logger依赖的服务,选方案1,扩展性更强。
内容的提问来源于stack exchange,提问作者Searles
相关产品推荐
相关产品推荐

