【发布时间】:2020-12-17 13:07:16
【问题描述】:
我有一个处理来自队列的消息的 Docker DotNet Core 控制台应用程序。
有一个名为 SimulationEngine 的类,我期待 ILogger 会被依赖注入自动传递
public class SimulationEngine
{
ILogger<SimulationEngine> logger;
public SimulationEngine(ILogger<SimulationEngine> logger)
{
this.logger = logger;
}
这是创建实例的方式:
public class RunsQueueProcessor : ...
{
public RunsQueueProcessor(..., ILogger<RunsQueueProcessor> logger)
{
}
protected override async Task ProcessMessage(...)
{
this.logger.LogInformation(...);
// Here DI is not working
var engine = new SimulationEngine();
DI 可以很好地将记录器注入RunsQueueProcessor,但是当我尝试new SimulationEngine() 时它会失败并出现以下错误:
Error CS7036 There is no argument given that corresponds to the required formal parameter 'logger' of 'SimulationEngine.Simui lationEngine(ILogger<SimulationEngine>)'
我如何告诉 DotNet 为该构造函数使用 DI?
--- 编辑 ---
我写这个问题是因为我正在研究 PoC,而且我不需要到处进行依赖注入。我只在进行单元测试以验证特定算法的少数地方需要它。
一个更具体的问题是,在使用 new 语句或手动实例化对象时,是否有办法配置 DotNet DI 框架以注入依赖项。
感谢所有 cmets 和答案,现在我对 DotNet DI 的工作原理有了更多了解。
【问题讨论】:
-
new SimulationEngine()没有获得 DI 的好处,您手动新建。您需要在new语句中提供记录器,或者从您的服务集合中请求一个实例 -
SimulationEngine没有使用DI,需要在构造函数中添加参数,例如:public RunsQueueProcessor(..., ILogger<RunsQueueProcessor> logger, SimulationEngine engine) -
谢谢两位,我的问题更多是“什么时候可以,什么时候不能使用 DI”。我期待 dotNet 能够在任何地方做到这一点,似乎它只适用于像 ASP 控制器这样的东西。对吗?
-
你对DI是什么有误解,建议你去读读。
-
定义一个接口 ISimulationEngine 并实现 SimulationEngine,然后在你的处理器中注入 ISimulationEngine
标签: c# .net-core dependency-injection