ASP.NET Core如何自定义配置源示例详解
前言
正如大家所知,在.NETCore中配置文件改成了appsettings.json,表面上和.NETFramework的web.config或app.config好像没有太大的区别,只是一种是json,一种是xml,但其实.NETCore的配置体系是一种全新的设计,灵活且具扩展性。这里主要介绍一下在.NETCore的配置体系下如何扩展自定义配置源,配置源其实就是配置信息存放的载体,最常用的就是文件类型。
.NETCore配置体系
在进行自定义配置源介绍前,我们需要先了解一下.NETCore中的配置体系。.NETCore的配置体系中主要包含ConfigurationProvider、ConfigurationSource、ConfigurationBuilder、Configuration几大核心对象。
ConfigurationProvider
实现IConfigurationProvider接口,配置源真正提供者,主要提供配置信息的加载与刷新。
ConfigurationSource
实现IConfigurationSource接口,提供对应的ConfigurationProvider具体实例。
ConfigurationBuilder
实现IConfigurationBuilder接口,负责将ConfigurationSource添加到配置源集合,再根据配置源集合构建出ConfigurationRoot对象,实现IConfigurationRoot接口。
Configuration
实现IConfiguration接口,Configuration对象在逻辑上体现出树形化层次结构,配置信息均已键/值对的方式提供使用。
注:*IConfigurationRoot、IConfigurationSection均继承于IConfiguration,IConfigurationRoot表示配置的根节点,IConfigurationSection则表示配置的非根节点*
所以他们之间的关系就是ConfigurationProvider实现配置提供,然后通过ConfigurationSource构造配置源实例,接着通过ConfigurationBuilder将配置源实例ConfigurationSource添加到配置源集合中并构造出ConfigurationRoot,最终以Configuration对象提供给程序使用。
默认情况下,Configuration对象的Providers属性包含如下Provider:
- ChainedConfigurationProvider:应用程序本身相关配置信息,如:applicationName、contentRoot;
- JsonConfigurationProvider:appsettings.json和appsettings.Development.json中的配置信息;
- EnvironmentVariablesConfigurationProvider:环境变量的配置信息;
- CommandLineConfigurationProvider:命令行输入的配置信息;
这些类型的Provider在.NETCoreWeb项目中默认会自动加载,不需要手动配置,当然预置的Provider并不止这几种。
自定义配置源
前面提到.NETCore的配置体系是具有扩展性的,所以我们可以实现自定义的配置源,比如基于配置中心(如:etcd、apollo、consul等)的实现,下面将模拟从配置中心获取,先了解整体实现方式,后面也会介绍我们在实际项目中基于etcd的实现方案。
创建ConfigurationProvider
自定义Provider需要继承ConfigurationProvider,然后重写Load方法,设置Data属性。
publicclassCustomConfigurationProvider:ConfigurationProvider { publicoverridevoidLoad() { //模拟从远程配置中心获取配置信息 usingvarhttpClient=newHttpClient { BaseAddress=newUri("http://localhost:5000") }; varresponse=httpClient.GetStringAsync("/api/configs") .ConfigureAwait(false) .GetAwaiter() .GetResult(); if(!string.IsNullOrEmpty(response)) { Data=JsonConvert.DeserializeObject>(response); } } }
http://localhost:5000/api/configs接口返回的json字符串,如下:
{"name":"beck","company":"mingdao"}
创建ConfigurationSource
实现IConfigurationSource接口,在Build方法中返回CustomConfigurationProvider实例。
publicclassCustomConfigurationSource:IConfigurationSource { publicIConfigurationProviderBuild(IConfigurationBuilderbuilder) { returnnewCustomConfigurationProvider(); } }
加入ConfigurationBuilder配置源列表
添加IConfigurationBuilder扩展方法AddCustom,将CustomConfigurationSource加入配置源集合中。
publicstaticclassCustomConfigurationExtensions { publicstaticIConfigurationBuilderAddCustom(thisIConfigurationBuilderbuilder) { returnbuilder.Add(newCustomConfigurationSource()); } }
启动入口添加AddCustom
在Program.cs中的ConfigureAppConfiguration引用自定义配置源:
publicstaticIHostBuilderCreateHostBuilder(string[]args)=> Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder=> { webBuilder.ConfigureAppConfiguration((context,configBuiler)=> { configBuiler.AddCustom(); }); webBuilder.UseStartup(); });
测试效果
再次查看Configuration对象的Providers属性,发现已包含CustomConfigurationProvider:
然后可通过Configuration对象获取对应key的内容:
[HttpGet] publicIEnumerableGet() { returnnewstring[]{_configuration["name"],_configuration["company"]}; }
总结
以上完成了一个简单的自定义配置源,实际情况会比这复杂些。如果关注过JsonConfigurationProvider的配置加载参数,有一个reloadOnChange参数用来设置当配置文件有变化时是否重新加载,如果reloadOnChange设置为true,当配置文件变化时不需要重启服务就可以生效,很多时候我们是需要Provider具有这个功能的,在接下来介绍的EtcdConfigurationProvider中会实现,实现源码已在Github可供参考。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。