尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

.NET 配置体系实战:深入 Microsoft.Extensions.Configuration.Ini INI 配置提供程序

.NET 配置体系实战:深入 Microsoft.Extensions.Configuration.Ini INI 配置提供程序 语言运行时标准库JIT编译编译器【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址https://gitcode.com/GitHub_Trending/runtime6/runtime点击查看免费下载导读本文聚焦 dotnet/runtime 仓库中Microsoft.Extensions.Configuration.Ini包它是 .NET 官方配置体系Microsoft.Extensions.Configuration的 INI 文件提供程序实现用于把 INI 文件如appsettings.ini解析为统一的IConfiguration键值配置模型。你将掌握AddIniFile/AddIniStream的完整用法、INI 语法解析规则注释、节、引号、嵌套节、错误处理行为以及optional/reloadOnChange等关键参数并从源码级理解其底层解析实现。包定位与仓库位置Microsoft.Extensions.Configuration.Ini是 .NET 官方配置提供程序家族的一员其实现代码位于仓库 src/libraries/Microsoft.Extensions.Configuration.Ini主要包含src/核心实现扩展方法、Source、Provider、流解析器ref/公共 API 参考Microsoft.Extensions.Configuration.Ini.cstests/完整的行为测试套件README.md本包使用文档从项目文件 Microsoft.Extensions.Configuration.Ini.csproj 可见它依赖Microsoft.Extensions.Configuration与Microsoft.Extensions.Configuration.FileExtensions两个项目因此天然继承了文件配置提供程序的通用能力文件监视、可选文件、IFileProvider抽象。同时它多目标编译支持netstandard2.0与 .NET Framework兼容面广。快速上手从 INI 文件构建配置根据 README.md 中的示例读取 INI 配置只需三步ConfigurationBuilder→AddIniFile→ 读取节与键值using System; using Microsoft.Extensions.Configuration; class Program { static void Main() { // Build a configuration object from INI file IConfiguration config new ConfigurationBuilder() .AddIniFile(appsettings.ini) .Build(); // Get a configuration section IConfigurationSection section config.GetSection(Settings); // Read configuration values Console.WriteLine($Server: {section[Server]}); Console.WriteLine($Database: {section[Database]}); } }配套的appsettings.ini内容[Settings] Serverexample.com DatabaseNorthwind在.csproj中把 INI 文件声明为复制到输出目录的内容项ItemGroup Content Includeappsettings.ini CopyToOutputDirectoryAlways/CopyToOutputDirectory /Content /ItemGroup需要说明这里的路径appsettings.ini是相对于ConfigurationBuilder的BasePath默认为当前工作目录解析的。若希望路径相对于程序集所在目录可在构建前调用SetBasePath(AppContext.BaseDirectory)。扩展方法全览AddIniFile 与 AddIniStream核心扩展方法定义在 IniConfigurationExtensions.cs共 6 个重载公共 API 见 ref 文件方法签名说明AddIniFile(this IConfigurationBuilder, string path)添加指定路径的 INI 文件文件必须存在不可选、不热重载AddIniFile(builder, string path, bool optional)控制文件是否可选AddIniFile(builder, string path, bool optional, bool reloadOnChange)额外控制文件变更时是否自动重载AddIniFile(builder, IFileProvider? provider, string path, bool optional, bool reloadOnChange)指定自定义IFileProvider访问文件AddIniFile(builder, ActionIniConfigurationSource? configureSource)通过委托完全自定义IniConfigurationSourceAddIniStream(builder, Stream stream)直接从一个Stream读取 INI 数据不经过文件系统各参数的默认行为从源码可以确认optional默认false文件不存在时Build()会抛出FileNotFoundException测试 IniConfigurationExtensionsTest.cs 中AddIniFile_ThrowsIfFileDoesNotExistAtPath验证了这一点设为true后文件缺失也不抛异常AddIniFile_DoesNotThrowsIfFileDoesNotExistAtPathAndOptional。reloadOnChange默认false设为true后FileConfigurationSource会注册文件监视器文件变化时自动触发配置重载。path为null或空字符串时抛出ArgumentException错误消息为资源文件中的Error_InvalidFilePathFile path must be a non-empty string.见 Strings.resx测试ThrowExceptionWhenPassingNullAsFilePath与ThrowExceptionWhenPassingEmptyStringAsFilePath均有覆盖。INI 语法解析规则源码级INI 文件的解析逻辑集中在 IniStreamConfigurationProvider.cs 的静态方法Read(Stream)中逐行处理规则如下1. 空白行与注释空白行直接跳过以;、#、/开头的行视为注释被忽略注意这三种注释符必须是该行第一个非空白字符。IniConfigurationProvider.cs 的 XML 文档中给出的完整示例[Section:Header] key1value1 key2 value2 ; comment # comment / comment测试SupportAndIgnoreComments验证了三种注释符均可被正确忽略。2. 节Section与嵌套节以[开头且以]结尾的行被识别为节头节名会去除首尾空白后追加ConfigurationPath.KeyDelimiter即冒号:作为后续键的前缀[Data:Inventory] ConnectionStringAnotherTestConnectionString等价于键Data:Inventory:ConnectionString。这意味着冒号同时承担节嵌套分隔符的职责。测试CanLoadValidIniFromStreamProvider与LoadKeyValuePairsFromValidIniFile均使用[Data:Inventory]与SubHeader:ProviderMySql验证了这种嵌套路径的展开。3. 键值对其余行必须以分隔键和值否则抛出FormatException消息来自Error_UnrecognizedLineFormatUnrecognized line format: {0}.。解析时键与值的首尾空白会被Trim()去除值如果被成对的双引号包裹value双引号会被剥除键不区分大小写因为结果字典使用StringComparer.OrdinalIgnoreCase。测试ShouldRemoveLeadingAndTrailingWhiteSpacesFromKeyAndValue\t key \t \t value\t→keyvalue与ShouldRemoveLeadingAndTrailingWhiteSpacesFromSectionName验证了空白处理LoadKeyValuePairsFromValidIniFileWithQuotedValues验证了引号剥除。关于引号有几个精确的边界行为见测试DoubleQuoteIsPartOfValueIfNotPaired与DoubleQuoteIsPartOfValueIfAppearInTheMiddleOfValue只有值首字符与末字符都是时才剥除双引号引号不成对如DefaultConnectionTestConnectionString时引号原样保留为值的一部分引号出现在值中间如TestConnectionString时同样原样保留。4. 重复键检测同一键含节前缀、忽略大小写出现两次时抛出FormatException消息来自Error_KeyIsDuplicatedA duplicate key {0} was found.。测试ThrowExceptionWhenKeyIsDuplicated验证了[Data:DefaultConnection]下的ConnectionString与[Data]下以冒号写的DefaultConnection:ConnectionString会被判定为同一键。5. 无节头文件不写节头、直接用冒号前缀书写完整键路径也是合法的测试LoadKeyValuePairsFromValidIniFileWithoutSectionHeader验证了这一点DefaultConnection:ConnectionStringTestConnectionString Data:Inventory:ProviderMySql解析器内部实现Read 方法剖析IniStreamConfigurationProvider.Read(Stream)是整个包的解析核心从源码看其流程如下IniStreamConfigurationProvider.cs用StringComparer.OrdinalIgnoreCase创建Dictionarystring, string?作为数据容器用StreamReader逐行读取sectionPrefix变量记录当前节前缀初始为空字符串每行先Trim()空白行continue首字符为;/#//的行continue若以[开头且以]结尾则把括号内的内容Trim()后拼接ConfigurationPath.KeyDelimiter更新sectionPrefix否则查找分隔符找不到就抛FormatException拼接key sectionPrefix 键部分.Trim()值部分Trim()再按规则处理成对双引号若data.ContainsKey(key)则抛重复键FormatException否则写入字典。IniConfigurationProvider与IniStreamConfigurationProvider都只是把Data IniStreamConfigurationProvider.Read(stream)或Data Read(stream)作为Load的实现见 IniConfigurationProvider.cs所以文件与流走的是同一套解析逻辑任何格式行为在两个入口上完全一致。IniConfigurationSource与IniStreamConfigurationSource分别是文件型与流型配置源的实现IniConfigurationSource.cs、IniStreamConfigurationSource.cs前者继承FileConfigurationSource因此获得IFileProvider、可选文件与热重载能力后者继承StreamConfigurationSource其Build方法直接返回对应的 Provider 实例。从 Stream 加载AddIniStream 的应用场景AddIniStream允许绕过文件系统直接从一个Stream构建配置非常适合配置内容来自网络、数据库、内存字符串或嵌入式资源的场景using var stream File.OpenRead(config.ini); var config new ConfigurationBuilder() .AddIniStream(stream) .Build();从实现看AddIniStream 内部注册的是IniStreamConfigurationSource。需要注意的差异流型配置源不支持热重载测试ReloadThrowsFromIniStreamProvider明确验证了对流构建的配置调用config.Reload()会抛出InvalidOperationException。此外测试CanLoadValidIniFromStreamProvider还验证了流来源的键同样不区分大小写config[defaultconnection:ConnectionString]可命中[DefaultConnection]节。错误行为汇总结合 Strings.resx 与测试所有异常行为可归纳如下场景异常类型消息path为 null 或空字符串ArgumentExceptionFile path must be a non-empty string.Error_InvalidFilePath文件不存在且optionalfalseFileNotFoundExceptionThe configuration file {path} was not found and is not optional. ...行内无分隔符FormatExceptionUnrecognized line format: {0}.Error_UnrecognizedLineFormat节头不完整如[ConnectionStringFormatException同上测试ThrowExceptionWhenFoundBrokenSectionHeader键重复忽略大小写FormatExceptionA duplicate key {0} was found.Error_KeyIsDuplicated对流配置调用Reload()InvalidOperationException—部署与分发方式根据 README.md 的 Deployment 章节Microsoft.Extensions.Configuration.Ini已包含在 ASP.NET Core 共享框架shared framework中因此 ASP.NET Core 应用无需显式安装即可使用同时该包也作为带外out-of-bandOOB包独立发布任何项目都可以直接通过 NuGet 引用Microsoft.Extensions.Configuration.Ini单独使用。测试验证与 API 稳定性本包携带三份测试文件是理解行为契约的最佳参考IniConfigurationTest.cs覆盖节/嵌套节、引号、注释、空白、重复键、坏行格式、缺失文件等全部解析行为IniConfigurationExtensionsTest.cs覆盖扩展方法的参数校验与可选文件行为ConfigurationProviderIniTest.csProvider 层面的加载测试。按照 README 的 Contribution Bar参见 src/libraries/README.md 中的约定该包 API 与功能已成熟但仍会不时扩展新特性属于接受新特性、新 API、缺陷修复与性能改进的组件。结语Microsoft.Extensions.Configuration.Ini用极少的代码核心解析器仅一个Read方法实现了对 INI 文件完整、健壮的解析支持注释、节、嵌套节、引号剥除、大小写不敏感键与重复键检测并通过继承FileConfigurationSource无缝获得可选文件与热重载能力。对于需要与 INI 格式兼容的存量配置或自定义配置源它是一个值得优先选用的官方实现其源码与测试也为理解 .NET 配置提供程序架构提供了一个简洁、完整的范本。赞分享语言运行时标准库JIT编译编译器【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址https://gitcode.com/GitHub_Trending/runtime6/runtime点击查看免费下载相关推荐.NET 中的 INI 配置提供程序用 Microsoft.Extensions.Configuration.Ini 读取 INI 文件.NET 中的 INI 配置提供程序用 Microsoft.Extensions.Configuration.Ini 读取 INI 文件 INI 是一种古老但语言运行时标准库JIT编译编译器.NET 配置系统实战Microsoft.Extensions.Configuration.Json JSON 配置提供程序完全指南.NET 配置系统实战Microsoft.Extensions.Configuration.Json JSON 配置提供程序完全指南 导读 本文基于 .NET语言运行时标准库JIT编译编译器.NET 运行时 User Secrets 配置提供程序Microsoft.Extensions.Configuration.UserSecrets原理与实战.NET 运行时 User Secrets 配置提供程序Microsoft.Extensions.Configuration.UserSecrets原理与实语言运行时标准库JIT编译编译器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表