ASP.NET Core的配置(1):读取配置信息
作者:网络转载 发布时间:[ 2016/5/27 10:55:44 ] 推荐标签:软件测试管理 配置管理
我们定义了另一个名为FormatSettings的类型来表示针对不同数据类型的格式设置。如下面的代码片段所示,它的两个属性DateTime和CurrencyDecimal分别表示针对日期/时间和货币数字的格式设置。FormatSettings依然具有一个参数类型为IConfiguration接口的构造函数,它的两个属性均在此构造函数中被初始化。值得注意的是初始化这两个属性采用的是当前Configuration的“子配置节”,通过指定配置节名称调用GetSection方法获得。
1: public class FormatSettings
2: {
3: public DateTimeFormatSettings DateTime { get; set; }
4: public CurrencyDecimalFormatSettings CurrencyDecimal { get; set; }
5:
6: public FormatSettings(IConfiguration configuration)
7: {
8: this.DateTime = new DateTimeFormatSettings(configuration.GetSection("DateTime"));
9: this.CurrencyDecimal = new CurrencyDecimalFormatSettings(configuration.GetSection("CurrencyDecimal"));
10: }
11: }
在我们上面演示的实例中,我们通过以一个MemoryConfigurationProvider对象来提供原始的配置信息。由于承载原始配置信息的是一个元素类型为KeyValuePair<string, string>的集合,所以原始配置在物理存储上并不具有树形化的层次结构,那么它如何能够终提供一个结构化的Configuration对象呢?其实很简单,虽然MemoryConfigurationProvider对象只能将配置信息存储为简单的“数据字典”,但是如果将Configuration对象在配置树中体现的路径作为Key,这个数据字典在逻辑上实际上具有了一棵树的结构。实际上MemoryConfigurationProvider是这么做的,这体现在我们如下所示的程序之中。
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: Dictionary<string, string> source = new Dictionary<string, string>
6: {
7: ["Format:DateTime:LongDatePattern"] = "dddd, MMMM d, yyyy",
8: ["Format:DateTime:LongTimePattern"] = "h:mm:ss tt",
9: ["Format:DateTime:ShortDatePattern"] = "M/d/yyyy",
10: ["Format:DateTime:ShortTimePattern"] = "h:mm tt",
11:
12: ["Format:CurrencyDecimal:Digits"] = "2",
13: ["Format:CurrencyDecimal:Symbol"] = "$",
14: };
15: IConfiguration configuration = new ConfigurationBuilder()
16: .Add(new MemoryConfigurationProvider(source))
17: .Build();
18:
19: FormatSettings settings = new FormatSettings(configuration.GetSection("Format"));
20: Console.WriteLine("DateTime:");
21: Console.WriteLine(" {0,-16}: {1}", "LongDatePattern", settings.DateTime.LongDatePattern);
22: Console.WriteLine(" {0,-16}: {1}", "LongTimePattern", settings.DateTime.LongTimePattern);
23: Console.WriteLine(" {0,-16}: {1}", "ShortDatePattern", settings.DateTime.ShortDatePattern);
24: Console.WriteLine(" {0,-16}: {1} ", "ShortTimePattern", settings.DateTime.ShortTimePattern);
25:
26: Console.WriteLine("CurrencyDecimal:");
27: Console.WriteLine(" {0,-16}: {1}", "Digits", settings.CurrencyDecimal.Digits);
28: Console.WriteLine(" {0,-16}: {1}", "Symbol", settings.CurrencyDecimal.Symbol);
29: }
30: }
如上面的代码片段所示,创建MemoryConfigurationProvider对象采用的字典对象包含6个基本的配置项,为了让它们在逻辑上具有一个树形化层次结构,所以的Key实际上体现了每个配置项所在配置节在配置树中的路径,路径采用冒号(“:”)进行分割。改程序执行之后会在控制台上呈现如下所示的输出结果。
1: DateTime:
2: LongDatePattern : dddd, MMMM d, yyyy
3: LongTimePattern : h:mm:ss tt
4: ShortDatePattern: M/d/yyyy
5: ShortTimePattern: h:mm tt
6:
7: CurrencyDecimal:
8: Digits : 2
9: Symbol : $
三、将结构化配置直接绑定为对象
在真正的项目开发过程中,我们都不会直接使用直接读取的配置,而都倾向于像我们演示的两个实例一样通过创建相应的类型(比如DateTimeFormatSettings、CurrencyDecimalSettings和FormatSettings)来定义一组相关的配置选项(Option),我们将定义配置选项(Option)的这些类型称为Option类型。在上面演示的实例中,为了创建这些封装配置的对象,我们都是采用手工读取配置的形式,如果定义的配置项太多的话,逐条读取配置项其实是一项非常繁琐的工作。
对于一个对象来说,如果我们将它的属性视为它的子节点,一个对象同样具有类似于Configuration对象的树形层次化结构。如果我们根据某个Option类型的结构来定义配置,或者反过来根据配置的结构来定义这个Option类型,那么Option类型的属性成员将与某个配置节具有一一对应的关系,那么原则上我们可以自动将配置信息绑定为一个具体的Option对象。
ASP.NET Core针对配置的Option模型(OptionModel)帮助我们实现了从配置到Option对象之间的绑定,接下来我们对此做一个简单的演示。Option模型实现在“Microsoft.Extensions.OptionModel”这个NuGet包中,除此之外,我们需要采用依赖注入的方式来使用Option模型,所以我们需要按照如下的方式为应用添加针对相应的依赖。
1: {
2: ...
3: "dependencies": {
4: "Microsoft.Extensions.OptionsModel" : "1.0.0-rc1-final",
5: "Microsoft.Extensions.DependencyInjection" : "1.0.0-rc1-final"
6: },
7: }
借助于Option模型的自动绑定机制,我们无需再手工地读取配置信息,所以我们将FormatSettings、DateTimeFormatSettings和CurrencyDecimalSettings的构造函数删除,只保留其属性成员。在作为程序入口的Main方法中,我们采用如下的方式创建这个表示格式设置的FormatSettings对象。
1: class Program
2: {
3: static void Main(string[] args)
4: {
5: Dictionary<string, string> source = new Dictionary<string, string>
6: {
7: ["Format:DateTime:LongDatePattern"] = "dddd, MMMM d, yyyy",
8: ["Format:DateTime:LongTimePattern"] = "h:mm:ss tt",
9: ["Format:DateTime:ShortDatePattern"] = "M/d/yyyy",
10: ["Format:DateTime:ShortTimePattern"] = "h:mm tt",
11:
12: ["Format:CurrencyDecimal:Digits"] = "2",
13: ["Format:CurrencyDecimal:Symbol"] = "$",
14: };
15: IConfiguration configuration = new ConfigurationBuilder()
16: .Add(new MemoryConfigurationProvider(source))
17: .Build()
18: .GetSection("Format"));
19:
20: IOptions<FormatSettings> optionsAccessor = new ServiceCollection()
21: .AddOptions()
22: .Configure<FormatSettings>(configuration)
23: .BuildServiceProvider()
24: .GetService<IOptions<FormatSettings>>();
25:
26: FormatSettings settings = optionsAccessor.Value;
27:
28: Console.WriteLine("DateTime:");
29: Console.WriteLine(" {0,-16}: {1}", "LongDatePattern",settings.DateTime.LongDatePattern);
30: Console.WriteLine(" {0,-16}: {1}", "LongTimePattern",settings.DateTime.LongTimePattern);
31: Console.WriteLine(" {0,-16}: {1}", "ShortDatePattern",settings.DateTime.ShortDatePattern);
32: Console.WriteLine(" {0,-16}: {1} ", "ShortTimePattern",settings.DateTime.ShortTimePattern);
33:
34: Console.WriteLine("CurrencyDecimal:");
35: Console.WriteLine(" {0,-16}: {1}", "Digits",settings.CurrencyDecimal.Digits);
36: Console.WriteLine(" {0,-16}: {1}", "Symbol",settings.CurrencyDecimal.Symbol);
37: }
38: }
如上面的代码片段所示,我们创建一个ServiceCollection对象并调用扩展方法AddOptions注册于针对Option模型的服务。接下来我们调用Configure方法将FormatSettings这个Option类型与对应的Configuration对象进行映射。我们后利用这个ServiceCollection对象生成一个ServiceProvider,并调用其GetService方法得到一个类型为IOptions<FormatSettings>的对象,后者的Value属性返回的是绑定了相关配置的FormatSettings对象。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南