.Net 中的 ActivatorUtilitiesConstructor 特性

.Net 中的 ActivatorUtilitiesConstructor 特性

[ActivatorUtilitiesConstructor]是 .NET 依赖注入中的一个特性,用于指导 Microsoft.Extensions.DependencyInjection(MSDI)在类型有多个构造函数时,选择哪个构造函数进行实例化。

主要用途

1.解决构造函数选择歧义

当一个类有多个构造函数时,MSDI 默认选择参数最多且都能从容器中解析的构造函数。但有时这会导致问题:

publicclassMyService{// 默认情况下,DI 会选择这个构造函数(参数最多)publicMyService(IService1s1,IService2s2,stringconfigValue){// configValue 无法从容器解析,会抛出异常!}// 实际上我们想用这个publicMyService(IService1s1,IService2s2){// 只有可解析的参数}}

2.明确指定构造函数

使用[ActivatorUtilitiesConstructor]明确告诉 DI 使用哪个:

publicclassMyService{publicMyService(IService1s1,IService2s2,stringconfigValue){// 这个不会被 DI 使用}[ActivatorUtilitiesConstructor]publicMyService(IService1s1,IService2s2){// DI 会优先使用这个构造函数}}

工作原理

  1. 标记优先级:标记的构造函数会被优先考虑
  2. 兼容性检查:只考虑标记的构造函数能否从容器解析所有参数
  3. 回退机制:如果标记的构造函数参数无法全部解析,会尝试其他构造函数

常见场景

场景1:有可选参数时

publicclassReportService{privatereadonlyILogger_logger;privatereadonlystring_format;publicReportService(ILogger<ReportService>logger){_logger=logger;_format="Default";}[ActivatorUtilitiesConstructor]publicReportService(ILogger<ReportService>logger,IOptions<ReportOptions>options){_logger=logger;_format=options.Value.Format;}}

场景2:第三方库扩展

// 扩展第三方库的类publicclassExtendedThirdPartyService:ThirdPartyService{// 第三方库可能没有无参构造函数publicExtendedThirdPartyService():base("default"){}[ActivatorUtilitiesConstructor]publicExtendedThirdPartyService(IConfigurationconfig):base(config.GetValue<string>("ApiKey")){}}

使用注意事项

1.仅用于ActivatorUtilities.CreateInstance

// 这个特性主要影响以下方法:varinstance=ActivatorUtilities.CreateInstance<MyService>(serviceProvider);varinstance=ActivatorUtilities.CreateInstance(serviceProvider,typeof(MyService));

2.与直接容器解析的区别

// 使用特性 - 受 [ActivatorUtilitiesConstructor] 影响services.AddTransient<MyService>();varservice=serviceProvider.GetService<MyService>();// 直接注册实例工厂 - 不使用该特性services.AddTransient(sp=>newMyService("hardcoded"));

3.多个标记会报错

publicclassBadExample{[ActivatorUtilitiesConstructor]publicBadExample(IService1s1){}[ActivatorUtilitiesConstructor]// ❌ 运行时错误:多个标记publicBadExample(IService2s2){}}

实际示例

publicclassPaymentProcessor{privatereadonlyIPaymentGateway_gateway;privatereadonlybool_useSandbox;// 用于测试或特定场景publicPaymentProcessor(IPaymentGatewaygateway){_gateway=gateway;_useSandbox=false;}// 生产环境使用 - 从配置读取[ActivatorUtilitiesConstructor]publicPaymentProcessor(IPaymentGatewaygateway,IConfigurationconfig){_gateway=gateway;_useSandbox=config.GetValue<bool>("Payment:UseSandbox");}}// 注册services.AddScoped<IPaymentGateway,StripeGateway>();services.AddScoped<PaymentProcessor>();// 使用时,DI 会自动选择带 [ActivatorUtilitiesConstructor] 的构造函数

替代方案

如果不想使用特性,也可以:

  1. 使用工厂方法注册
services.AddScoped(sp=>newMyService(sp.GetRequiredService<IService1>(),sp.GetRequiredService<IService2>()));
  1. 简化设计(推荐):尽量保持单个构造函数,使用 Options 模式处理配置。

总结

[ActivatorUtilitiesConstructor]是一个解决构造函数选择问题的工具,但在良好设计的应用中应该很少需要。优先考虑通过单一构造函数Options 模式来简化设计,这会使代码更清晰且易于测试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1165462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Open Code教程(四)| 高级配置与集成

Open Code教程&#xff08;四&#xff09;| 高级配置与集成OpenCode 高级配置与集成一、前言二、本地模型配置方式一&#xff1a;Ollama&#xff08;推荐&#xff09;方式二&#xff1a;LM Studio方式三&#xff1a;llama.cpp本地模型推荐三、AGENTS.md 配置创建方式推荐结构高…

django-flask基于python的大学生班级档案管理系统

目录django-flask基于python的大学生班级档案管理系统摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;django-flask基于python的大学生班级档案管理系统摘要 该系统基于Python语…

什么是SR-MPLS

文章目录为什么需要SR-MPLSSR-MPLS vs MPLSSR-MPLS的工作原理从SR-MPLS到SRv6SR-MPLS&#xff08;Segment Routing MPLS&#xff0c;基于MPLS转发平面的段路由&#xff09;是基于源路由理念而设计的在网络上转发数据包的一种协议。SR-MPLS的核心思想是将报文转发路径切割成不同…

救命神器10个一键生成论文工具,专科生毕业论文轻松搞定!

救命神器10个一键生成论文工具&#xff0c;专科生毕业论文轻松搞定&#xff01; AI 工具如何让论文写作变得轻松 对于许多专科生来说&#xff0c;毕业论文的撰写无疑是一道难以逾越的难关。从选题到开题&#xff0c;从查找到写作&#xff0c;每一个环节都可能让人感到力不从心。…

django-flask基于python的大学生创新计划项目管理web系统

目录Django-Flask 基于 Python 的大学生创新计划项目管理 Web 系统摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;Django-Flask 基于 Python 的大学生创新计划项目管理 Web 系统…

打开软件出现找不到d3dx9_36.dll如何修复? 附免费下载方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

学霸同款2026 TOP8 AI论文软件:本科生毕业论文必备测评

学霸同款2026 TOP8 AI论文软件&#xff1a;本科生毕业论文必备测评 2026年学术写作工具测评&#xff1a;为何需要一份精准榜单&#xff1f; 随着AI技术在学术领域的深入应用&#xff0c;越来越多的本科生开始依赖AI工具辅助论文写作。然而&#xff0c;面对市场上琳琅满目的AI论…

django-flask基于python的大学生公益活动志愿服务系统的设计与实现

目录 摘要 关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 摘要 随着社会对公益事业的关注度不断提升&#xff0c;大学生参与志愿服务活动的需求日益增长。传统的志愿服务管理方式…

软件打开提示找不到d3dx9_30.dll文件 如何修复? 附免费下载方法

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

django-flask基于python的大学生兼职网站的设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着互联网技术的快速发展&#xff0c;在线兼职平台已成为大学生获取社会实践机会的重要渠道。本文基于Python技术栈&…

计算机毕业设计springboot罕见病科普交流平台 SpringBoot 驱动的“罕见病智慧科普与互动服务系统” 基于 SpringBoot 的“罕见病知识共享与病友互助平台”

计算机毕业设计springboot罕见病科普交流平台fhi4o8jo &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当罕见病遇上互联网&#xff0c;信息鸿沟便有望被填平。面对种类繁多、资料…

Open Code教程(一)| 快速入门:安装配置与基础使用

Open Code教程&#xff08;一&#xff09;| 快速入门&#xff1a;安装配置与基础使用OpenCode 快速入门&#xff1a;安装配置与基础使用一、什么是 OpenCode核心特点开发团队发布时间线相关开源项目二、OpenCode vs Claude Code 对比选择建议三、网络环境说明需要科学上网无需科…

【实测有效】分享5款亲测好用的论文降AI神器,轻松解决AI率过高问题,通过AI检测

现在写论文&#xff0c;真正难住人的不一定是内容。有时候&#xff0c;明明自己一字一句写完了&#xff0c;扔进检测系统一查——直接提示“AI生成内容过多&#xff0c;禁止提交。”真的是非常搞心态。 你认真整理的逻辑、反复推敲的结构&#xff0c;在系统眼里&#xff0c;就…

学霸同款9个AI论文软件,本科生轻松搞定毕业论文!

学霸同款9个AI论文软件&#xff0c;本科生轻松搞定毕业论文&#xff01; 1.「千笔」—— 一站式学术支持“专家”&#xff0c;从初稿到降重一步到位&#xff08;推荐指数&#xff1a;★★★★★&#xff09;对于本科生来说&#xff0c;论文写作不仅是对知识的综合运用&#xff…

论文AI率过高怎么办?亲测推荐5款降AI神器,高效降AIGC看这篇就够了!【建议收藏】

现在写论文&#xff0c;真正难住人的不一定是内容。有时候&#xff0c;明明自己一字一句写完了&#xff0c;扔进检测系统一查——直接提示“AI生成内容过多&#xff0c;禁止提交。”真的是非常搞心态。 你认真整理的逻辑、反复推敲的结构&#xff0c;在系统眼里&#xff0c;就…

Windows Server 2016 中文版、英文版下载 (2026 年 1 月更新)

Windows Server 2016 中文版、英文版下载 (2026 年 1 月更新) Windows Server 2016 x64 Version 1607 (updated Jan 2026) 请访问原文链接&#xff1a;https://sysin.org/blog/windows-server-2016/ 查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;…

选择敏捷咨询公司前,你一定要问的几个问题

企业做敏捷转型&#xff0c;最怕找错人、走弯路。市面上的敏捷咨询公司鱼龙混杂&#xff0c;有的主打低价培训&#xff0c;有的空谈理论框架&#xff0c;真正能帮企业解决实际问题的并不多。想要让敏捷转型真正落地见效&#xff0c;在合作前一定要问清楚以下几个关键问题&#…

破解 IPD 落地难题:专业咨询管理公司的核心价值

IPD&#xff08;集成产品开发&#xff09;体系的重要性已无需多言&#xff0c;但在“知道”与“做到”之间&#xff0c;往往横亘着一条难以逾越的实践鸿沟。许多企业满怀期待启动变革&#xff0c;却在落地过程中步履维艰——流程看似完整&#xff0c;却难以融入实际业务&#x…

Open Code教程(二)| 命令与技巧大全

Open Code教程&#xff08;二&#xff09;| 命令与技巧大全 OpenCode 命令与技巧大全一、前言二、命令大全斜杠命令&#xff08;/commands&#xff09; 三、快捷键大全基础操作消息浏览Leader 键命令 四、文件引用&#xff08; 符号&#xff09;技巧 五、Shell 命令&#xff08…

论文从AI率80%到10%的技巧分享:5款降AI工具实战经验,手把手教你如何降ai

现在写论文&#xff0c;真正难住人的不一定是内容。有时候&#xff0c;明明自己一字一句写完了&#xff0c;扔进检测系统一查——直接提示“AI生成内容过多&#xff0c;禁止提交。”真的是非常搞心态。 你认真整理的逻辑、反复推敲的结构&#xff0c;在系统眼里&#xff0c;就…