在 ConfigureServices 中注册服务时会调用哪个构造函数

use*_*794 7 .net c# asp.net-mvc asp.net-core

如果一个类有两个构造函数,当我在 ConfigureServices 中注册该服务时,服务容器如何选择使用哪一个?

所以可以说我有一个MyClass用相应的接口调用的类IMyClass。在ConfigureServices()我调用以下代码行的方法中

services.AddScoped<IMyClass, MyClass>();
Run Code Online (Sandbox Code Playgroud)

如果我有以下构造函数,它如何选择要使用的构造函数?

MyClass(ILogger logger)

MyClass(ILogger logger, IConfguration configuration)
Run Code Online (Sandbox Code Playgroud)

Mét*_*ule 7

构造函数匹配由称为CallSiteFactory:CreateConstructorCallSite的方法执行。根据其源代码,算法如下:

  • 查找目标类型的所有公共构造函数
    • 如果没有,则抛出异常
    • 如果只有一个,请使用它
  • 按参数数量对所有构造函数进行排序(首先是参数最多的构造函数)
    • 选择DI可以注入的参数数量最多的一个
    • 如果有多个这样的ctor,则抛出异常
  • 如果没有可以使用的构造函数,则抛出异常

为了澄清何时可能存在歧义,请考虑以下因素:

MyClass(ILogger logger)
MyClass(IConfguration configuration)
Run Code Online (Sandbox Code Playgroud)

DI 引擎无法决定使用哪一个,因为两者都有可以注入的有效参数。

但是,在以下情况下,没有歧义,因为int类型未在 DI 引擎中注册,因此无法通过 DI 注入,因此将选择第一个 ctor:

MyClass(ILogger logger)
MyClass(int i)
Run Code Online (Sandbox Code Playgroud)

所以回答你的问题:在你的情况下,将使用第二个构造函数。