news 2026/3/12 3:35:20

.Net 中的 ActivatorUtilitiesConstructor 特性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
.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 模式来简化设计,这会使代码更清晰且易于测试。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/6 16:12:50

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

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

作者头像 李华
网站建设 2026/3/8 15:08:28

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

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

作者头像 李华
网站建设 2026/2/23 9:34:04

槽型光电开关传感器原理图设计,已量产(光电传感器)

目录 1、光电检测前端:信号的 “源” 电路 2、信号缓冲:小器件解决电平与驱动问题 3、电路工作流程:从遮挡到信号输出 4、设计细节:避免踩坑的几个小技巧 在嵌入式设备的位置限位、物料计数等场景中,槽型光电开关是性价比极高的传感器方案 —— 它通过遮挡发射器与接收…

作者头像 李华
网站建设 2026/3/11 8:58:02

零基础学习大语言模型之十四:注意力机制

本文首先介绍了自然语言处理从基于规则到深度学习的演进过程,重点分析了词嵌入技术在语义表示中的关键作用。随后详细阐述了编码器-解码器结构,引入了注意力机制和多头注意力的讨论。注意力机制是当前生成式AI取得突破的技术基础。 生成式人工智能是指通过学习训练数据的分布…

作者头像 李华
网站建设 2026/3/7 17:04:01

高性能32位MCU微控制器数字电源参考方案

在电源管理领域&#xff0c;数字电源凭借其智能化、可编程与高集成度优势&#xff0c;正逐步取代传统开关电源。数字电源不仅具备基本的电压转换功能&#xff0c;还集成了实时通信、数控调节及环境参数监测等能力&#xff0c;大幅提升了系统的可靠性与灵活性。英尚微电子基于MM…

作者头像 李华
网站建设 2026/3/11 16:20:27

导师严选2026 AI论文软件TOP10:专科生毕业论文写作全测评

导师严选2026 AI论文软件TOP10&#xff1a;专科生毕业论文写作全测评 2026年专科生论文写作工具测评&#xff1a;为何需要一份专业榜单&#xff1f; 随着AI技术在学术领域的广泛应用&#xff0c;越来越多的专科生开始借助智能写作工具提升论文效率。然而&#xff0c;市面上的AI…

作者头像 李华