【发布时间】:2022-01-16 01:03:00
【问题描述】:
我需要将记录器(ILogger)添加到 MyDbConnection 的现有对象中,该对象是从工厂创建的,该工厂与 MyOptions 类一起注册在 NET Core DI 中
public class MyFactory : IMyFactory
{
private readonly MyOptions _options;
public MyFactory(MyOptions options)
{
_options = options;
}
public MyDbConnection CreateDbA() => new MyDbConnection(_options.ConnStrA);
public MyDbConnection CreateDbB() => new MyDbConnection(_options.ConnStrB);
public MyDbConnection CreateDbC() => new MyDbConnection(_options.ConnStrC);
}
工厂然后被注入到服务中,然后使用它来创建对象并做一些事情
public class MyService : IMyService
{
public MyService(IMyFactory factory)
{
var a = factory.CreateDbA();
var b = factory.CreateDbB();
a.DoSomething();
b.DoSomething();
}
}
MyDbConnection 如下所示:
public class MyDbConnection
{
private string connStr;
//private ILogger logger;
//public MyDbConnection(string connStr, ILogger logger)
public MyDbConnection(string connStr)
{
this.connStr = connStr;
//this.logger = Logger;
}
public void DoSomething()
{
//logger.LogWarning();
}
}
问题是我不能只添加 ILogger 并从 DI 容器中注入它,因为工厂正在使用“新”来创建 MyDbConnection,而不使用 DI。我目前唯一的解决方案是使用静态记录器而不是注入一个,但这似乎是一个糟糕的解决方案。还有其他方法吗?应该怎么做才合适?
【问题讨论】:
-
您可以配置/使用 DI 来获取
MyDbConnection的新实例。如果这不是您想要的,那么只需将ILogger添加到您的工厂:public MyFactory(MyOptions options, ILogger logger)并将注入的记录器传递到新的连接中。 -
一个小故事:您的连接是否以某种方式处理?或者你只是展示一个省略处理的示例代码?
-
@MetroSmurf 将 ILogger 添加到工厂也是我的想法之一,但毕竟我决定尝试寻找更好的解决方案
-
@WiktorZychla 这只是示例代码,基于现有的,我已经将其简化并显示我遇到的问题
标签: c# .net-core dependency-injection