CSDN|基于选项模式实现.NET Core的配置热更新


CSDN|基于选项模式实现.NET Core的配置热更新
本文插图
作者 | 秦元培
头图 | CSDN 下载自东方 IC 最近在面试的时候 , 遇到了一个关于 .NET Core 配置热更新的问题 , 顾名思义 , 就是在应用程序的配置发生变化时 , 如何在不重启应用的情况下使用当前配置 。 从 .NET Framework 一路走来 , 对于 Web.Config 以及 App.Config 这两个配置文件 , 我们应该是非常熟悉了 , 通常情况下 ,IIS 会检测这两个配置文件的变化 , 并自动完成配置的加载 , 可以说它天然支持热更新 , 可当我们的视野伸向分布式环境的时候 , 这种配置方式就变得繁琐起来 , 因为你需要修改一个又一个配置文件 , 更不用说这些配置文件可能都是放在容器内部 。 而有经验的朋友 , 可能会想到 , 利用 Redis 的发布-订阅来实现配置的下发 , 这的确是一个非常好的思路 。 总而言之 , 我们希望应用可以随时感知配置的变化 , 所以 , 在今天这篇博客里 , 我们来一起聊聊 .NET Core 中配置热更新相关的话题 , 这里特指全新的选项模式(Options) 。
在 .NET Core 中 , 选项模式(Options)使用类来对一组配置信息进行强类型访问 , 因为按照接口分隔原则(ISP)和关注点分离这两个工程原则 , 应用的不同部件的配置应该是各自独立的 , 这意味着每一个用于访问配置信息的类 , 应该是只依赖它所需要的配置信息的 。 举一个简单的例子 , 虽然 Redis 和 MySQL 都属于数据持久化层的设施 , 但是两者属于不同类型的部件 , 它们拥有属于各自的配置信息 , 而这两套配置信息应该是相互独立的 , 即 MySQL 不会因为 Redis 的配置存在问题而停止工作 。 此时 , 选项模式(Options)推荐使用两个不同的类来访问各自的配置 。 我们从下面这个例子开始:{ "Learning": { "Years": 5, "Topic": [ "Hotfix", ".NET Core", "Options" ], "Skill": [ { "Lang": "C#", "Score": 3.9 }, { "Lang": "Python", "Score": 2.6 }, { "Lang": "JavaScript", "Score": 2.8 } ] } }此时 , 如果希望访问Learning节点下的信息 , 我们有很多种实现方式:
//方式1 var learningSection = Configuration.GetSection("Learning"); var careerYears = learningSection.GetValue<decimal>("Years"); var topicHotfix = learningSection.GetValue<string>("Topic:0"); //方式2 var careerYears = Configuration["Learning:Years"]; var topicHotfix = Configuration["Learning:Topic:0"); [Serializable] public class LearningOptions { public decimal Years { get; set; } public List<string> Topic { get; set; } public List<SkillItem> Skill { get; set; } } [Serializable] public class SkillItem { public string Lang { get; set; } public decimal? Score { get; set; } } 同样地 , 茴香的茴字有几种写法 , 你可知道?
//写法1:手动绑定 var leaningOptions = new LearningOptions; Configuration.GetSection("Learning").Bind(leaningOptions);


推荐阅读