【发布时间】: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<Dog>。 -
stackoverflow.com/questions/359122/… 显示对工厂的依赖,但您可以使用
Func<Dog>作为依赖...
标签: c# .net-core dependency-injection