如果一个类有两个构造函数,当我在 ConfigureServices 中注册该服务时,服务容器如何选择使用哪一个构造函数?
假设我有一个名为MyClass
有相应的接口IMyClass
。在里面ConfigureServices()
方法我调用以下代码行
services.AddScoped<IMyClass, MyClass>();
如果我有以下构造函数,它如何选择使用哪个构造函数?
MyClass(ILogger logger)
MyClass(ILogger logger, IConfguration configuration)
构造函数匹配是由一个名为的方法执行的CallSiteFactory:CreateConstructorCallSite。根据其源代码,算法如下:
- Find all public constructors of the target type
- Sort all constructors by their number of arguments (ctors with most arguments first)
- 选择可通过 DI 注入的参数数量最多的一个
- 如果有多个这样的ctor,则抛出异常
- 如果没有可以使用的构造函数,则抛出异常
为了澄清何时可能存在歧义,请考虑以下因素:
MyClass(ILogger logger)
MyClass(IConfguration configuration)
DI 引擎无法决定使用哪一个,因为两者都有可以注入的有效参数。
然而,在下面的例子中,没有任何歧义,因为int
type 未在 DI 引擎中注册,因此无法通过 DI 注入,因此将选择第一个 ctor:
MyClass(ILogger logger)
MyClass(int i)
因此,回答您的问题:在您的情况下,将使用第二个构造函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)