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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 04:28:22