# Huioo.Learning.Configuration **Repository Path**: huioo/huioo-learning-configuration ## Basic Information - **Project Name**: Huioo.Learning.Configuration - **Description**: No description available - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-10-13 - **Last Updated**: 2025-05-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Huioo.Learning.Configuration 传统配置,Web.Config,ConfigurationManager类,不推荐。 .NET中的配置系统支持丰富的配置源,包括文件(json、xml、ini等)、注册表、环境变量、命令行参数、Azure Key Vault等,还可以配置自定义配置源。还可以实时跟踪配置的改变,可以按照优先级覆盖。 json文件配置 1. 创建一个json文件,比如config.json,设置“如果较新则复制”。 2. Nuget 安装 Microsoft.Extensions.Configuration.Json。 3. 编写代码,先用简单的方式读取配置。 绑定读取配置 1. 可以绑定一个类,自动完成配置的读取。 2. Nuget 安装 Microsoft.Extensions.Configuration.Binder。 推荐配置 1. 推荐使用选项方式读取,和DI结合更好,且更好利用“reloadchange”机制。 2. NuGet 安装 Microsoft.Extensions.Options.ConfigurationExtensions。 3. 读取配置的时候,DI要声明IOptions、IOptionsMonitor、IOptionSnapshot等类型。 4. IOptions不会读取到新的值,运行时更新配置不会生效,仅读一次。 4. 和IOptionsMonitor相比,IOptionSnapshot会在同一个范围内(比如ASP.NET Core一个请求中)保持一致。 相比,IOptionSnapshot。 5. 在读取配置的地方,用lOptionsSnapshot注入。不要在构造函数里直接读取l0ptionsSnapshot.value,而是到用到的地方再读取,否则就无法更新变化。 ```csharp services.AddOptions() .Configure(e =>config.GetSection("DB").Bind(e)) .Configure(e =>config.Getsection("smtp").Bind(e)); services.AddTransient();//不能用Singleton ``` 命令行参数配置 1. 配置框架支持从命令行参数、环境变量等地方读取配置。 2. NuGet 安装 Microsoft.Extensions.Configuration.CommandLine。 扁平化配置 1. 对于环境变量、命令行等简单的键值对结构,如果想要进行复杂结构的配置,需要进行“扁平化处理”。 2. 对于配置的名字需要采用“层级配置”。例如:`a:b:c`。对于序列,使用索引,这样配置`a:b:c:1`、`a:b:c:2`。 环境变量配置 1. NuGet安装 Microsoft.Extensions.Configuration.EnvironmentVariables。 2. 然后configurationBuilder.AddEnvironmentVariables() 3. AddEnvironmentVariables()有无参数和有prefix参数的两个重载版本。无参数版本会把程序相关的所有环境变量都加载进来,由于有可能和系统中已有的环境变量冲突,因此建议用有prefix参数的AddEnvironmentVariables()。读取配置的时候,prefix参数会被忽略。 3. VS中调试时,避免修改系统环境变量,直接在VS中设置环境变量的方法。 其他配置源 1. 还支持ini、xml等格式的配置源,如果想用查询文档即 2. 还支持在运行时、调试时加载不同的ison文件; 3. 还内置或者第三方支持中心化配置服务器,比如使用Apollo、Nacos等开源服务器,或者使用Azure、阿里云等的配置服务。具体看文档即可 开发自定义配置提供者的步骤 1. 开发一个直接或者间接实现IConfiguratidnProvider接口的类XXXConfigurationProvider,一般继承自ConfigurationProvider。如果是从文件读取,可以继承自FileConfigurationProwider。重写Load方法,把“扁平化数据设置到Data属性即可。 2. 再开发一个实现了IConfigurationsource接口的类XXXConfigurationSource。如果是从文件读取,可以继承自FileConfigurationSource。在Build方法中返回上面的ConfigurationProvider对象。 3. 然后使用即可,configurationBuilder.Add(new ConfigurationSource())即可。为了简化使用,一般提供一个IConfigurationBuilder的扩展方法, 4. 整体流程:编写ConfigurationProvider类实际读取配置;编写ConfigurationSource在Build中返回ConfigurationProvider对象;把ConfigurationSource对象加入IConfigurationBuilder。 开发Web.config提供者 1. .NET Core中不建议使用.NET Framework里的web.config,不过仍然继续提供了ConfigurationManager了,不过没有官方支持通过新的Configuration框架读取的方式。我们来实现一个,能够读取web.config里的connectionstrings和appSettings的内容。没用过web.config也没关系 2. 这个项目主要意义还是展示如何编写自定义配置提供者,实用意义不大。主要为下一个更实用的配置提供者做知识准备。 项目需求 1、网站用集群部署,如果用本地配置文件,每次修改都要挨个修改。有Apollo、Nacos等开源的配置中心以及云服务平台的配置服务,但是项目对于配置的要求没有非常复杂,因此决定在关系数据库中保存配置。 2、已经开源https://github.com/yangzhongke/Zack.AnyDBConfigProvider 3、按照文档先使用一下,站在使用者角度体验一下。思考自己如何实现。项目亮点:value支持json格式。 为什么多配置源 1. 比如:某个网站需要自定义配置;程序员的同一台机器上,开发调试环境和测试环境用不同的配置。 2. 按照注册到ConfigurationBuilder的顺序,“后来者居上”,后注册的优先级高,如果配置名字重复,用后注册的值。 3. 实验:控制台的覆盖环境变量的,自定义Provider的覆盖控制台的。 保命的UserSecrets 1. .NET 提供了user-secrets机制,user-secrets的配置不放到源代码中 2. Nuget安装:Microsoft.Extensions.Configuration.UserSecrets 3. 在VS项目上点右键(管理用户机密),编辑这个配置文件。看看这个文件在哪里。会自动在csproj中的Usersecretsld就是文件夹的名字。 4. configBuilder.AddUserSecrets() 注意 1、不能泄漏到源码中的配置放到user-secrets即可,不用都放。 2、一般把user-secrets优先级放到普通json文件之后。 3、如果开发人员电脑重装系统等原因造成本地的配置文件删除了,就需要重新配置。 4、并不是生产中的加密,只适用于开发。