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

2023-11-24

如果一个类有两个构造函数,当我在 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 引擎无法决定使用哪一个,因为两者都有可以注入的有效参数。

然而,在下面的例子中,没有任何歧义,因为inttype 未在 DI 引擎中注册,因此无法通过 DI 注入,因此将选择第一个 ctor:

MyClass(ILogger logger)
MyClass(int i)

因此,回答您的问题:在您的情况下,将使用第二个构造函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在ConfigureServices中注册服务时会调用哪个构造函数 的相关文章

  • WPF Dispatchertimer 延迟反应/冻结

    在我的 WPF 应用程序中 我使用 3 个不同的 DispatcherTimers 一种是用于显示当前时间 一种是每 5 秒运行一次数据库查询 第三个每 1 秒刷新一次自定义按钮的值 当我的程序运行时 有很多延迟 冻结 例如 时间开始正确计
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • 计算复杂数组的abs()值的最快方法

    我想计算 C 或 C 中复杂数组元素的绝对值 最简单的方法是 for int i 0 i lt N i b i cabs a i 但对于大向量来说 速度会很慢 有没有办法加快速度 例如使用并行化 语言可以是 C 或 C 鉴于所有循环迭代都是
  • Keyboard.Focus(item) 和 item.Focus() 有什么区别?

    在 WPF 中 有两种方法将焦点设置到元素 您可以调用输入元素的 Focus 方法 也可以使用输入元素作为参数调用 Keyboard Focus first way item Focus alternate way Keyboard Foc
  • 函数指针上的未知类型 F TYPE

    include
  • 试图使用加密来混淆我的项目打破了它

    我试图尝试不同的混淆选项 为了做到这一点 我首先尝试了加密货币 以下是我遵循的步骤 打开加密向导并选择一些选项 选择我的解决方案文件 完成向导后 我看到有些 Dll 被很好地混淆了 但我的项目现在无法构建 我注意到的两件事是 我的文件夹中有
  • 如何从Web JavaScript应用程序获取桌面C#程序中的变量

    我遇到一个问题 有两个应用程序 一种是 C 中的桌面应用程序 另一种是 javascript 中的 Web 应用程序 运行桌面应用程序中的一些变量或信息需要传输到Web应用程序 有谁知道如何解决这个问题 有人愿意提供更多细节来解决这个问题吗
  • Identity Server 4:添加访问令牌的声明

    我正在使用 Identity Server 4 和隐式流 并且想要向访问令牌添加一些声明 新的声明或属性是 tenantId 和 langId 我已将 langId 添加为我的范围之一 如下所示 然后通过身份服务器请求 但我也获得了tena
  • 除空字符串外的任何内容的正则表达式

    是否可以使用正则表达式来检测任何不是 空字符串 的内容 如下所示 string s1 string s2 string s3 string s4 etc 我知道我可以使用修剪等 但我想使用正则表达式 s 将匹配任何包含至少一个非空格字符的字
  • 将授权标头添加到 Web 参考

    我正在尝试向客户端的网络服务发出请求 我不知道客户端的底层平台 我使用 添加 Web 引用 在 Visual Studio 2010 中使用了客户端的 WSDL 并生成了我的代理类 称为 ContactService 我现在需要将如下所示的
  • 我可以对(非成员)函数使用部分模板特化吗?

    我试图在 非成员 函数上使用部分模板专业化 但我在语法上遇到了问题 我在 StackOverflow 中搜索了其他部分模板专业化问题 但这些问题涉及类或成员函数模板的部分专业化 作为起点 我有 struct RGBA RGBA uint8
  • Request.Form 和 Request.QueryString 之间的区别?

    有人可以告诉我两者之间的确切区别吗Request Form and Request QueryString 我知道一个区别 比如 如果HTTP请求方式为POST 则用户提交的数据在申请表 收藏 如果HTTP请求方法是GET 则用户提交的数据
  • 为什么未到达的 try-catch 块会增加运行时间?

    我目前正在创建自己的容器库 但我已经看到无法访问 if 语句无效 try catch阻止增加运行时间 这是我的测试 Vector cpp template
  • 将 Web API 添加到 asp.net MVC 项目时出现问题(追溯)

    我正在 Visual Studio 2013 中使用 asp net mvc 迈出第一步 但遇到了一个奇怪的问题 我以 MVC 的形式启动了我的项目 并且没有选中 Web API 框来包含核心参考 不过现在我想使用 Web API 功能 我
  • 使用 _Alignas 进行结构成员对齐

    我想知道以下问题 是新的吗 Alignas结盟 C11 中的说明符适用于结构成员吗 我一直假设这么多 但彻底阅读了 N1570 公开草案似乎表明对齐说明符不能 出现在一个说明符限定符列表 这就是我所期望的 如果得到支持的话 我已经读过几遍语
  • #define 内存地址声明

    这个 define 语句有什么作用 它用于定义内存地址 但我不明白 uint32 t 部分 define GPxDAT uint32 t 0x6FC0 通常用于访问映射到地址空间的硬件寄存器 或者一些特定的内存地址 硬件寄存器应定义为vol
  • 将 System.Array 从 .Net 编组到 vb6

    我有一个 Net 组件 它有一个 COM 可见类 该类具有返回 System Array 的方法 它实际上返回一个字符串数组 但返回类型声明为 System Array 不要问我 为什么 我知道我可以将返回类型声明为 string 这样就可
  • C++ 联合数组和变量?

    在C 中没有办法做这样的事情吗 union Scalar x y Scalar v 2 Where x v 0 and y v 1 既然您使用的是 C 而不是 C 并且它们具有相同的类型 为什么不直接将 x 设为对 v 0 的引用 将 y
  • 如何组合||条件语句中的运算符[重复]

    这个问题在这里已经有答案了 代替 if foo 1 foo 5 foo 9 我喜欢将它们组合起来 类似于以下内容 这不起作用 if foo 1 5 9 那可能吗 不幸的是不是 你最好的选择是创建一个扩展方法 public static bo
  • 如何使用完全空的类型使 Activator.CreateInstance 运行速度减慢约 20 倍

    Given NET 程序集命名expression host NET 程序集命名CreateInstanceTest CreateInstanceTest 在其配置文件中启用 NetFx40 LegacySecurityPolicy exp

随机推荐

  • 未找到 Gradle DSL 方法:“multiDexEnabled()”

    我遵循了 multidex 指南https developer android com tools building multidex html 但我收到这个错误未找到 Gradle DSL 方法 multiDexEnabled 我更新了
  • Response.WriteFile -- 写出字节流

    是否可以使用 Response Write WriteFile 从动态创建的位图写入 http 响应流 而不将图像保存到硬盘驱动器 您可以使用MemoryStream并将其分配给Response OutputStream 或者简单地使用Re
  • 如何通过.properties文件使@RequestParam可配置?

    我们如何通过 properties 文件进行以下配置 RequestParam value page required false defaultValue 0 Integer page RequestParam value size re
  • F#:如何使用 SQL 数据源创建 Deedle Frame

    我试图找出当数据来自 SQL 服务器时 在 F 中创建 Deedle 框架的最佳方法是什么 我尝试过类似以下的事情 I packages Deedle 0 9 12 load Deedle fsx r System dll r System
  • C# 注册表 SetValue 抛出 UnauthorizedAccessException

    在你尝试用 快速谷歌搜索 来回答这个问题之前 我想指出的是我已经这样做了 这是情况 我有以下方法尝试修改注册表项值 我遇到的问题是 执行时 它会抛出 UnauthorizedAccessException即使我已经将密钥打开为可写 我以管理
  • spring javaconfig、xml配置和注解之间的性能差异

    我们的 Spring 配置包含大约 1200 个 bean 并且我们使用 component scan Autowired 如果我们将 ApplicationContext 导出为 Xml 并且仍然使用 Autowired 我们可以节省大约
  • 带有 Bower 支持的 Webpack

    我想加载最好的节点包 并且仅当不存在时才加载 Bower 包 我只会按照 Webpack 站点中的建议使用节点包 但我需要加载一个位于 Bower 中的库 https github com Stamplay stamplay js sdk和
  • 计算经纬度坐标的中点

    有谁知道获得一对纬度和经度点的中点的最佳方法 我使用 d3 js 在地图上绘制点 需要在两点之间绘制一条曲线 因此我需要创建一个中点来在线条中绘制曲线 请参阅下图以更好地理解我正在尝试做的事情 对长脚本表示歉意 画东西看起来很有趣 我已经划
  • 在 GitHub 上指定备用项目级 README.md

    使用 GitHub 的基于 Web 的界面 我无法弄清楚如何为项目的 README 文件指定备用路径 文件名 创建新的自述文件时 Web 界面确实提供了使用我想要的任意路径或文件名的选项 但我选择的文件不会用作项目级自述文件 我希望当用户访
  • 获得 (omniauth-facebook) 和 (omniauth-twitter) 工作

    我在用着 Ruby on Rails 4 设计3 0 3 全方位认证 1 1 4 omn iauth facebook 1 4 1 omn iauth twitter 1 0 0 我最近设置了我的omniauth facebook一切正常
  • 如何将 Proguard 混淆集成到我的 JavaFX 的 IntelliJ 工件中?

    我正在使用 IntelliJ IDEA 作为 IDE 开发 JavaFX 应用程序 到目前为止 一切都运行顺利 我已经配置了所有外部库并且正确创建了我的 JavaFX 工件 现在我想在创建工件时集成混淆 使用 Proguard Intell
  • 没有BOM的UTF-8 html显示奇怪的字符

    我有一些 HTML 其中包含一些外来字符 HTML 文档保存为无 BOM 的 UTF 8 当我在浏览器中查看页面时 外来字符似乎被奇怪的字符组合 所取代 只有当我将 HTML 文档保存为带有 BOM 的 UTF 8 时 字符才能正确显示 我
  • 追踪 Android 中的内存/窗口泄漏?

    Android开发中如何追踪内存泄漏 我正在使用 eclipse IDE 来开发该应用程序 我不知道如何纠正内存或窗口泄漏异常 任何想法 主要是窗口泄漏错误引发非法参数异常 如何纠正这两个问题 请帮忙 如果你真的想知道如何跟踪一般的内存泄漏
  • 如何使用 postgresql 在 sqlalchemy 中显式转换数组文字的类型?

    在尝试通过cast type coerce和type 来转换文字数组类型并且没有成功之后 我想我会问 from pprint import pprint from sqlalchemy import String null Integer
  • 语句和PreparedStatement的区别

    准备好的语句是语句的稍微强大的版本 并且应该始终至少与语句一样快速且易于处理 准备好的语句可以参数化 大多数关系数据库通过四个步骤处理 JDBC SQL 查询 解析传入的 SQL 查询 编译 SQL 查询 规划 优化数据采集路径 执行优化的
  • backbone.js 视图在模型获取之前渲染

    我正在尝试制作一个小型的backbone js 应用程序 但在处理事情的顺序方面遇到了困难 在我的 html 文件中 标题中有两个脚本块 在我的 app js 中 我定义了一个简单的模型 视图和路由器 function window MyM
  • LinkBut​​ton 命令事件似乎没有触发

    我使用 AJAX Control Toolkit Accordion LinkBut ton 和 TextBox 创建了一个简单的用户控件 如下所示 测试控制 ascx
  • 该函数有太多语句。 (41)

    我有这个控制器 controller ctrl function scope rootScope timeout alert location tooltip popover BetSlipFactory AccordionsFactory
  • PhoneGap iOS 应用程序图标 [重复]

    这个问题在这里已经有答案了 因此 我尝试使用以下指南在 config xml 文件中为我的应用程序指定自定义 iOS 图标 https build phonegap com docs config xml 然而 当我使用他们给你的代码行时
  • 在ConfigureServices中注册服务时会调用哪个构造函数

    如果一个类有两个构造函数 当我在 ConfigureServices 中注册该服务时 服务容器如何选择使用哪一个构造函数 假设我有一个名为MyClass有相应的接口IMyClass 在里面ConfigureServices 方法我调用以下代