利用接口中的静态虚拟成员实现自定义配置节

news/2025/9/30 23:15:31/文章来源:https://www.cnblogs.com/qife122/p/19121912

利用接口中的静态虚拟成员实现自定义配置节

C# 11引入了一项新特性——接口中的静态虚拟成员。该特性的主要动机是支持通用数学算法。提到数学可能会让一些人忽略这个特性,但实际上它在其他场景中也很有用。

例如,我利用这个特性清理了注册和使用自定义配置节类型的方式。

自定义配置节

作为回顾,让我们看看自定义配置节。假设您想在appSettings.json中配置API客户端。您可以将配置节映射到类型。例如,以下是我某个项目中的appSettings.json文件。

{"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": "*","OpenAI": {"ApiKey": "Set this in User Secrets","OrganizationId": "{Set this to your org id}","Model": "gpt-4","EmbeddingModel": "text-embedding-3-large"}
}

与其通过IConfiguration API逐个读取"OpenAI"设置,我更倾向于将其映射到一个类型。

public class OpenAIOptions {public string? ApiKey { get; init; }public string? OrganizationId { get; init; }public string Model { get; init; } = "gpt-3.5-turbo";public string EmbeddingModel { get; init; } = "text-embedding-ada-002";
}

在Program.cs中,我可以配置这个映射。

builder.Configuration.Configure<OpenAIOptions>(builder.Configuration.GetSection("OpenAI"));

配置完成后,我可以将IOptions注入到通过依赖解析解析的任何类中,并以强类型方式访问配置节属性。

using Microsoft.Extensions.Options;public class OpenAIClient(IOptions<OpenAIOptions> options) {string? ApiKey => options.Value.ApiKey;string? Model => options.Value.Model;// ...
}

有时,由于某种原因无法注入IOptions。您可以通过IConfiguration获取它。

Configuration.GetSection("OpenAI").Get<OpenAIOptions>()

静态虚拟接口来清理

这一切都很好,但当您有多个配置类时,会有些重复。我希望构建一个更基于约定的方法。这就是静态虚拟成员接口派上用场的地方。

首先,为所有配置节定义一个接口。

public interface IConfigOptions
{static abstract string SectionName { get; }
}

注意,有一个名为SectionName的静态抽象字符串属性。这是静态虚拟成员。任何实现此接口的类型都必须实现静态SectionName属性。

现在,我将在配置类中实现该接口。

public class OpenAIOptions : IConfigOptions {public static string SectionName => "OpenAI";public string? ApiKey { get; init; }public string? OrganizationId { get; init; }public string Model { get; init; } = "gpt-3.5-turbo";public string EmbeddingModel { get; init; } = "text-embedding-ada-002";
}

有了这个,我可以实现一个扩展方法来在注册配置节类型时访问SectionName。

public static class OptionsExtensions {public static IHostApplicationBuilder Configure<TOptions>(this IHostApplicationBuilder builder)where TOptions : class, IConfigOptions{var section = builder.Configuration.GetSection(TOptions.SectionName);builder.Services.Configure<TOptions>(section);return builder;}public static TOptions? GetConfigurationSection<TOptions>(this IHostApplicationBuilder builder)where TOptions : class, IConfigOptions{return builder.Configuration.GetSection(TOptions.SectionName).Get<TOptions>();}
}

现在,使用这个方法,我可以这样注册配置节:

builder.Configure<OpenAIOptions>();

当您有多个配置节需要配置时,注册代码看起来简洁明了。

例如,在一个项目中,我有这样的部分:

builder.Configure<OpenAIOptions>().Configure<GitHubOptions>().Configure<GoogleOptions>().Configure<WeatherOptions>()

结论

敏锐的读者会注意到,我不需要在这里使用静态虚拟成员。我本可以通过使用反射从类型名称中提取配置节名称来构建基于约定的方法。确实如此,但代码不如这种方法紧凑。此外,有时您可能希望类型名称与节名称不同。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

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

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

相关文章

天线增益与有源接收面积之间的关系

最近在看卫星通信,在学习星地链路传输的时候看到以下内容对于频率低于 1 GHz 的频段,使用有源接收面积接收电波时效率提升很困难 频率较低时,波长较长,小口径天线有效接收面积(有效口径)反而较小 有源接收面积 \…

US$54 AM29FXXX Adapter for CG Pro 9S12 Programmer

AM29FXXX Adapter for CG Pro 9S12 ProgrammerAM29FXXX Adapter is used to do AM29F200/AM29F400/AM29F800 series chip for ECU repair, Immobilizer repair etc.If your CG Pro 9S12 is with new design, please ch…

阜阳网站设计贵州普安县建设局网站

事务的特性 ACID 事务的隔离级别 并发事务问题 脏读&#xff1a;一个事务读到另一个事务还没有提交的数据不可重复读&#xff1a;一个事务先后读取同一条记录&#xff0c;但两次读取的数据不同幻读&#xff1a;一个事务按照条件查询数据时&#xff0c;没有对应的数据行&#xf…

2025CSP-S晋级和英才计划入围后:我走过了哪些路

九月就这样在瞬息之间离去,在九月的最后一天里,我开始回忆。 今年的CSP-S1在9月20日,开学后只有三周时间,第二周和第三周的周一二三,学校给我们安排了晚自习第三节课的初赛练题,很显然这是不够的。 在一个信奥弱…

流量分析

流量分析 主要还是对近期遇到的流量题目做一个总结,重在思路总结,方便以后翻阅@_@ 题目:[第九章][9.3.2 webshell混淆流量分析]webshell流量分析 NetA一把梭手搓 wireshark,筛选http->按包的长度(length)排序…

常州网站建设外包手机商场网站制作

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

数据表和网站建设的关系个人名片模板

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…

fdsaf -

Hello World fdafd fdaf function aa(){alert(1) }

【J+S 二十连测】-- 第十二套爆炸记

已成彩笔这都能打炸,为啥我这么菜啊?这都能打炸,为啥我这么菜啊?这都能打炸,为啥我这么菜啊?这都能打炸,为啥我这么菜啊?这都能打炸,为啥我这么菜啊?这都能打炸,为啥我这么菜啊?这都能打炸,为啥我这么菜啊…

2025-2026-1 CS3311 软件工程 个人项目第一版已发布

程序已开源在github 以下是任务清单: 时间单位:h,最小单位0.5计划明确需求:0.5开发分析需求、生成设计文档、设计复审、代码规范:1.5 具体设计:2 具体编码:6 代码复审:1.5 测试:1.5记录用时:0 测试报告:2.5…

Python浅拷贝、深拷贝

浅拷贝和深拷贝是处理复杂数据结构(如列表、字典、对象等)时的两种复制方式,核心区别在于是否复制嵌套的数据结构:1. 浅拷贝(Shallow Copy) 只复制最外层的数据,而嵌套的子对象(如列表中的列表、字典中的列表等…

免费网站开发框架做棋牌网站建设

ob对比其他软件 上文提到obsidian&#xff0c;这里对obsidian做一个简要的总结 优点&#xff1a;对比notion&#xff0c;语雀这些软件&#xff0c;内容存储在应用商的服务器上。它是存在本地的。 对比思源笔记。说一下思源笔记的不足。思源是块来控制的&#xff0c;回车就是一…

RPC在分布式存储系统中的应用 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

知名的家居行业网站开发南通门户网站建设

前言 云计算带来的优势之一便是弹性能力&#xff0c;云原生场景下Kubernetes提供了水平弹性扩容能力&#xff08;HPA&#xff09;&#xff0c;让应用可以随着实时指标进行扩/缩。然而HPA的实际工作情况可能和我们直观预想的情况是不一样的&#xff0c;这里面存在一些认知误区。…

US$134 Tango Toyota Key Maker Authorization Service

Tango Toyota Key Maker Authorization ServiceIf you buy Tango Key Programmer Basic Software (SK80), and want to get the Toyota Key Maker Authorization, you can buy this service.Tips: No need shipping, a…

阿里业务身份建模

目录背景和价值一、基础:业务身份抽象——给盒马一个“独立且兼容”的“数字身份证”1. 业务身份的具体定义2. 抽象身份的核心价值:隔离共性与个性案例场景二、核心:流程引擎与双流程模版——线下线上“同路不同程”…

实用指南:矩阵结构体 图片绘制 超级玛丽demo6

实用指南:矩阵结构体 图片绘制 超级玛丽demo6pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &q…

网站百度收录批量查询无锡百姓网推广代理商

UWA Gears 是UWA最新发布的无SDK性能分析工具。针对移动平台&#xff0c;提供了实时监测和截帧分析功能&#xff0c;帮助您精准定位性能热点&#xff0c;提升应用的整体表现。 在上周的文章中&#xff0c;我们详细介绍了网格查看器的功能&#xff0c;介绍如何通过网格数据优化…

C语言实战任务:贪吃蛇(2)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年10.1~10.6日信息竞赛计划安排表

Day1: Educational Codeforces Round 5 abc127 Day2: 【MX-J25】梦熊 J 组 猫耳小赛 & TPOI Round 4 洛谷的 Day3: Educational Codeforces Round 6 abc128