【问题标题】:How do I pass a ILogger<T> into a object created with new?如何将 ILogger<T> 传递给使用 new 创建的对象?
【发布时间】:2021-03-02 00:19:46
【问题描述】:

我想将记录器传递给对象的构造函数。通常,记录器是依赖注入到一个类中,但我想在一个没有依赖注入的类中记录。

我有一个 .NET Core 辅助服务。在该服务中,我有一个在运行时创建的类的 0 多个实例。我还希望能够将消息记录到该类中的记录器。

在我的示例中,我可以传递从 TimedWorker 内部获取的 ILogger,但类型错误。

目前,我有:

    class TimedWorker : BackgroundService
    {
        private List<Dog> m_dogs;
        private ILogger<TimedWorker> m_logger;
        private IConfiguration m_configuration;

        public TimedWorker(ILogger<TimedWorker> logger, IConfiguration configuration)
        {
            m_logger = logger;
            m_configuration = configuration;
        }

        public override Task StartAsync(CancellationToken cancellationToken)
        {
            m_dogs= new List<Dogs>();
            List<DogOption> dogOptions= new List<DogOption>();
            m_configuration.GetSection("Dogs").Bind(dogOptions);

            foreach(DogOption option in dogOptions)
            {
                m_dogs.Add(new Dog(option, m_logger));
            }
        } 

    ///...

    }

    class Dog {
        public string Name { get; }
        private int Age;
        private ILogger m_logger;

        public Dog(DogOption option, ILogger logger)
        {
            m_logger = logger;

            Name = option.Name;
            Age = option.Age;

            m_logger.LogInformation($"Dog '{Name}' created");
        }
    }

问题是当它记录时,记录器的类型是 TimedWorker,而不是 Dog。因此,当我查看日志时,它们被标记为 TimedWorker 而不是 Dog。我不知道如何将 ILogger 传递给 Dog 类。有什么建议吗?

【问题讨论】:

  • m_logger 似乎没有在任何地方定义
  • 我会修复代码。我试图创建一个最低限度的工作示例,却忘了把它放进去
  • @ChadK:我没有建议应该这样做。
  • 不,我说TimedWorker应该传递依赖ILogger&lt;Dog&gt;
  • stackoverflow.com/questions/359122/… 显示对工厂的依赖,但您可以使用 Func&lt;Dog&gt; 作为依赖...

标签: c# .net-core dependency-injection


【解决方案1】:

您可以注入IServiceProvider 并手动解决依赖关系。

你可以这样做:

public class Worker
{
    private readonly IServiceProvider _serviceProvider;

    public Worker(IServiceProvider serviceProvider)
    {
        _serviceProvider = serviceProvider;
    }

    public void Start()
    {
        var specificLogger = _serviceProvider.GetService(typeof(ILogger<Dog>)) as ILogger<Dog>;

        var dog = new Dog(specificLogger);
    }
}
public class Dog
{
    public Dog(ILogger<Dog> logger)
    {
        logger.LogInformation("Hello");
    }
}

这会根据类创建特定的日志。

2020-11-18 18:41:58.1275||INFO|ConsoleApp.Dog|Hello

【讨论】:

    【解决方案2】:

    您可以直接创建记录器。例如:

    var logger = LoggerFactory.Create(options => {}).Create<Worker>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 2019-09-12
      • 2018-05-23
      • 1970-01-01
      相关资源
      最近更新 更多