解读ASP.NET 5 & MVC6系列教程(5):Configuration配置

在前面的章节中,我们知道新版的MVC程序抛弃了原来的web.config文件机制,取而代替的是config.json,今天我们就来深入研究一下配置文件的相关内容。

基本用法

新版的配置信息机制在Microsoft.Framework.ConfigurationModel命名空间下进行了重写,重写以后不仅支持XML格式,还支持json、ini、环境变量等。在模板示例程序中Startup类的构造函数内如,有如下语句:

// Setup configuration sources. Configuration = new Configuration() .AddJsonFile("config.json") .AddEnvironmentVariables();

该语句的作用是将config.json文件以及环境变量信息加入到配置信息容器里,以便进行读取。而读取的时候则可以通过集合索引的形式或Get方法进行读取,示例如下:

var path = Configuration["Path"]; var path = Configuration.Get("Path");

其中,多层级key键的读取,需要在多个层级名称之间用冒号分割即可,示例如下:

var connString = Configuration.Get("Data:DefaultConnection:ConnectionString");

通过上述几段代码可以看出,该配置示例并不是全局实例,所以要想在别的地方也读取这些信息,就需要将该实例保存在一个全局静态变量上。

架构设计

新的配置信息处理机制,在重写以后,更加轻量级,而且是进行跨平台使用,可以从多个数据源获取配置信息,而不必在拘泥于.config文件,而且甚至可以为不同的环境(开发、测试、生产)设置不同的配置信息。整个配置机制的各个重要实体见下图:

/uploads/allimg/200612/1F3443524_0.png

我们来一一讲述一下,这些类的具体作用:

1.IConfiguration - 配置信息的实例接口,该接口上的indexer、Get、TryGet、Set以及其它一些像Reload这样的方法一起用于获取基于key/value的配置信息。

2.IConfigurationSource - 该接口统一了各个配置源使用时的接口方法,比如TryGet、Set以及最重要的读取配置信息的load方法,以便将信息加载到配置子系统里。

3.IConfigurationSourceContainer - 所有配置源信息的一个容器,该容器使得可以在一个单独的Configuration实例上加载各种配置源的配置信息。该接口只有一个Add方法用于添加基于IConfigurationSource的配置源信息。

4.Configuration - 该类实现了IConfiguration接口和IConfigurationSourceContainer接口,不保存基于key/value的所有类型的配置信息。

5.ConfigurationExtensions - 扩展方法,用于快速加载配置信息,如AddCommandLine、AddIniFile等。

在Microsoft.Framework.ConfigurationModel命名空间下,目前有6种不同类型的配置源类型可以使用,分别如下:

1.MemoryConfigurationSource - 该配置源目前没有内置的add/load扩展方法(比如AddMemoryConfiguration),但你可以加载key/value类型的集合来实现此目的(如IEnumerable<KeyValuePair<string, string>>类型)。

2.IniFileConfigurationSource - 该配置源,可以将基于key/value格式的INI文件配置信息加载到配置系统中。

3.CommandLineConfigurationSource - 将程序启动时的命令行参数信息加载到配置系统中。

4.EnvironmentVariablesConfigurationSource - 将操作系统的环境变量信息加载到配置系统中,在Azure Website中,环境变量可以通过web界面进行设置,管理相当方便。

5.JsonConfigurationSource - 将json文件的信息加载配置系统。

6.XmlconfigurationSource - 将xml文件的信息加载到配置系统。

详细用法

首先,由于配置系统是多实例型的,所以每次使用之前都要先声明一个示例,代码如下:

IConfiguration configuration = new Configuration();

添加MemoryConfigurationSource

由于在IConfigurationSourceContainer上没有为MemoryConfigurationSource定义快速加载配置信息的扩展方法,所以如果想加载这种类型的配置信息,则需要按照如下形式进行添加:

((IConfigurationSourceContainer)Configuration) .Add(new MemoryConfigurationSource( new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("mem-key1", "mem-value1"), new KeyValuePair<string, string>("mem-key2", "mem-value2") })); //取值方式 var someConfiguration1 = Configuration["mem-key1"]; var someConfiguration2 = Configuration.Get("mem-key2");

添加IniFileConfigurationSource

IniFileConfigurationSource类型的配置信息可以通过扩展方法进行加载,代码如下:

var configuration = new Configuration().AddIniFile("path\\to\\your\\configuration-ini-file.ini");

其中ini文件的格式模板如下:

[ini-sec] ini-key1=value-a ini-key2=value-b [ini-sec2] ini-key1=value-c ini-key2=value-d

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjysfj.html