gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 14:53:33 27 4
gpt4 key购买 nike

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

所以假设我有一个名为 MyClass 的类(class)有对应的接口(interface)IMyClass .在 ConfigureServices()方法我调用以下代码行

services.AddScoped<IMyClass, MyClass>();

如果我有以下构造函数,它如何选择使用哪个构造函数?
MyClass(ILogger logger)

MyClass(ILogger logger, IConfguration configuration)

最佳答案

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

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

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

    MyClass(ILogger logger)
    MyClass(IConfguration configuration)

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

    然而,在以下情况下,没有歧义,因为 int type 未在 DI 引擎中注册,因此无法通过 DI 注入(inject),因此将选择第一个 ctor:

    MyClass(ILogger logger)
    MyClass(int i)

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

    关于c# - 在 ConfigureServices 中注册服务时会调用哪个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59316224/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com