ASP.NET Core配置教程之读取配置信息_.docx

上传人:PIYPING 文档编号:11625502 上传时间:2021-08-26 格式:DOCX 页数:17 大小:16.95KB
返回 下载 相关 举报
ASP.NET Core配置教程之读取配置信息_.docx_第1页
第1页 / 共17页
ASP.NET Core配置教程之读取配置信息_.docx_第2页
第2页 / 共17页
ASP.NET Core配置教程之读取配置信息_.docx_第3页
第3页 / 共17页
ASP.NET Core配置教程之读取配置信息_.docx_第4页
第4页 / 共17页
ASP.NET Core配置教程之读取配置信息_.docx_第5页
第5页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《ASP.NET Core配置教程之读取配置信息_.docx》由会员分享,可在线阅读,更多相关《ASP.NET Core配置教程之读取配置信息_.docx(17页珍藏版)》请在三一文库上搜索。

1、ASP.NET Core配置教程之读取配置信息_ 提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马出现出两个特别文件的身影,那就是我们再熟识不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置信息定义在这两个文件之中。到了.NET Core的时候,许多我们习以为常的东西都发生了转变,其中也包括定义配置的方式。总的来说,新的配置系统显得更加轻量级,并且具有更好的扩展性,其最大的特点就是支持多样化的数据源。我们可以采纳内存的变量作为配置的数据源,也可以挺直配置定义在长久化的文件甚至数据库中。 由于许多人都不曾接触过这个采纳全新设计的配置系统,为了让大家对

2、此有一个感官的认识,我们先从编程的角度对它作一个初体验。针对配置的API涉及三个对象,它们分别是Configuration、ConfigurationBuilder和ConfigurationProvider,配置模型中具有相应的接口来表示它们。这三个对象之间的关系很清楚,Configuration对象承载着在编程过程中用法的配置信息,ConfigurationProvider则是配置信息原始数据源的供应者,两者之间沟通由ConfigurationBuilder来完成,它利用ConfigurationProvider提取源数据将其转换为Configuration对象。 一、以键-值对的形式读取

3、配置 虽然在大部分状况下的配置信息从整体来说都具有一个结构化的层次关系,但是“原子”配置项都以最简洁的“键-值对”的形式来体现,并且键和值都是字符串,接下来我们会通过一个简洁的实例来演示如何以键值对的形式来读取配置。我们创建一个针对ASP.NET Core的掌握台应用,并在project.json中根据如下的方式添加针对“Microsoft.Extensions.Configuration”这个NuGet包的依靠,配置模型就实现在这个包中。 . dependencies: Microsoft.Extensions.Configuration: 1.0.0-rc1-final , 假设我们的应用

4、需要通过配置来设定日期/时间的显示格式,为此我们定义了如下一个DateTimeFormatSettings类,它的四个属性体现了DateTime对象的四种显示格式(分别为长日期/时间和短日期/时间)。 public class DateTimeFormatSettings public string LongDatePattern get; set; public string LongTimePattern get; set; public string ShortDatePattern get; set; public string ShortTimePattern get; set; /

5、其他成员 我们盼望通过配置的形式来掌握由DateTimeFormatSettings的四个属性体现的日期/时间显示格式,所以我们为它定义了一个构造函数。如下面的代码片段所示,该构造函数具有一个IConfiguration接口类型的参数,它正式承载相关配置信息的Configuration对象。我们调用Configuration对象的索引并指定相应配置项的Key来得到其Value。 public class DateTimeFormatSettings /其他成员 public DateTimeFormatSettings (IConfiguration configuration) this.L

6、ongDatePattern = configurationLongDatePattern; this.LongTimePattern = configurationLongTimePattern; this.ShortDatePattern = configurationShortDatePattern; this.ShortTimePattern = configurationShortTimePattern; 要创建一个体现当前配置的DateTimeFormatSettings对象,我们必需向得到这个承载相关配置信息的Configuration对象。正如我们上面所说,Configurat

7、ion对象是由ConfigurationBuilder创建的,而原始的配置信息则是通过相应的ConfigurationProvider来读取的,所以创建一个Configuration对象的正确编程方式是先创建一个ConfigurationBuilder对象,然后为之添加一个或者多个ConfigurationProvider对象,最终利用ConfigurationBuilder来创建我们需要的Configuration对象。 根据上述的编程模式,我们在一个掌握台应用中编写了如下的程序。我们创建了一个类型为ConfigurationBuilder的对象,调用其Add方法添加的Configurati

8、onProvider是一个类型为MemoryConfigurationProvider的对象。顾名思义,MemoryConfigurationProvider利用内存中的对象来供应原始的配置信息,具体来说这些原始的配置信息保存在一个元素类型为KeyValuePairstring, string的集合之中。我们最终调用ConfigurationBuilder的Build方法猎取用于创建DateTimeFormatSettings对象所需的Configuration。 public class Program public static void Main(string args) Diction

9、arystring, string source = new Dictionarystring, string LongDatePattern = dddd, MMMM d, yyyy, LongTimePattern = h:mm:ss tt, ShortDatePattern = M/d/yyyy, ShortTimePattern = h:mm tt ; IConfiguration configuration = new ConfigurationBuilder() .Add(new MemoryConfigurationProvider(source) .Build(); DateT

10、imeFormatSettings settings = new DateTimeFormatSettings(configuration); Console.WriteLine(0,-16: 1, LongDatePattern, settings.LongDatePattern); Console.WriteLine(0,-16: 1, LongTimePattern, settings.LongTimePattern); Console.WriteLine(0,-16: 1, ShortDatePattern, settings.ShortDatePattern); Console.Wr

11、iteLine(0,-16: 1, ShortTimePattern, settings.ShortTimePattern); 为了验证依据配置创建的DateTimeFormatSettings对象与配置原始数据之间的关系,我们将它的四个属性输出于掌握台上。当这个程序执行之后将在掌握台上产生如下所示的输出,可以看出它正是我们供应的配置的真实反映。 LongDatePattern : dddd, MMMM d, yyyy LongTimePattern : h:mm:ss tt ShortDatePattern: M/d/yyyy ShortTimePattern: h:mm tt 二、 读取结

12、构化的配置 真实项目中涉及的配置大都具有一个结构化的层次结构,所以在配置模型中的Configuration对象同样具有这样的结构。结构化的配置具有一个树形层次结构,而一个Configuration对象表示的是组成这棵配置树的某个节点,这棵配置树则可以通过作为根节点的Configuration对象来体现。体现为键值对的原子配置项一般至存在于作为叶子节点的Configuration对象中,非叶子节点的Configuration包含一组子节点,而每个子节点同样是一个Configuration对象。 接下来我们同样以实例的方式来演示如何定义并读取具有层次化结构的配置。我们依旧沿用上一节的应用场景,现在

13、我们不仅仅需要设置日期/时间的格式,还需要设置其他数据类型的格式,比如表示货币的Decimal类型。为此我们定义了如下一个CurrencyDecimalFormatSettings类,它的属性Digits和Symbol分别表示小数位数和货币符号,一个CurrencyDecimalFormatSettings对象依旧是利用一个表示配置的Configuration对象来创建的。 public int Digits get; set; public string Symbol get; set; public CurrencyDecimalFormatSettings(IConfiguration

14、configuration) this.Digits = int.Parse(configurationDigits); this.Symbol = configurationSymbol; 我们定义了另一个名为FormatSettings的类型来表示针对不同数据类型的格式设置。如下面的代码片段所示,它的两个属性DateTime和CurrencyDecimal分别表示针对日期/时间和货币数字的格式设置。FormatSettings依旧具有一个参数类型为IConfiguration接口的构造函数,它的两个属性均在此构造函数中被初始化。值得留意的是初始化这两个属性采纳的是当前Configurati

15、on的“子配置节”,通过指定配置节名称调用GetSection方法获得。 public class FormatSettings public DateTimeFormatSettings DateTime get; set; public CurrencyDecimalFormatSettings CurrencyDecimal get; set; public FormatSettings(IConfiguration configuration) this.DateTime = new DateTimeFormatSettings(configuration.GetSection(Dat

16、eTime); this.CurrencyDecimal = new CurrencyDecimalFormatSettings(configuration.GetSection(CurrencyDecimal); 在我们上面演示的实例中,我们通过以一个MemoryConfigurationProvider对象来供应原始的配置信息。由于承载原始配置信息的是一个元素类型为KeyValuePairstring, string的集合,所以原始配置在物理存储上并不具有树形化的层次结构,那么它如何能够最终供应一个结构化的Configuration对象呢?其实很简洁,虽然MemoryConfigurati

17、onProvider对象只能将配置信息存储为简洁的“数据字典”,但是假如将Configuration对象在配置树中体现的路径作为Key,这个数据字典在规律上事实上就具有了一棵树的结构。事实上MemoryConfigurationProvider就是这么做的,这体现在我们如下所示的程序之中。 class Program static void Main(string args) Dictionarystring, string source = new Dictionarystring, string Format:DateTime:LongDatePattern = dddd, MMMM d,

18、 yyyy, Format:DateTime:LongTimePattern = h:mm:ss tt, Format:DateTime:ShortDatePattern = M/d/yyyy, Format:DateTime:ShortTimePattern = h:mm tt, Format:CurrencyDecimal:Digits = 2, Format:CurrencyDecimal:Symbol = $, ; IConfiguration configuration = new ConfigurationBuilder() .Add(new MemoryConfiguration

19、Provider(source) .Build(); FormatSettings settings = new FormatSettings(configuration.GetSection(Format); Console.WriteLine(DateTime:); Console.WriteLine(t0,-16: 1, LongDatePattern, settings.DateTime.LongDatePattern); Console.WriteLine(t0,-16: 1, LongTimePattern, settings.DateTime.LongTimePattern);

20、Console.WriteLine(t0,-16: 1, ShortDatePattern, settings.DateTime.ShortDatePattern); Console.WriteLine(t0,-16: 1n, ShortTimePattern, settings.DateTime.ShortTimePattern); Console.WriteLine(CurrencyDecimal:); Console.WriteLine(t0,-16: 1, Digits, settings.CurrencyDecimal.Digits); Console.WriteLine(t0,-1

21、6: 1, Symbol, settings.CurrencyDecimal.Symbol); 如上面的代码片段所示,创建MemoryConfigurationProvider对象采纳的字典对象包含6个基本的配置项,为了让它们在规律上具有一个树形化层次结构,所以的Key事实上体现了每个配置项所在配置节在配置树中的路径,路径采纳冒号(“:”)进行分割。改程序执行之后会在掌握台上呈现如下所示的输出结果。 DateTime: LongDatePattern : dddd, MMMM d, yyyy LongTimePattern : h:mm:ss tt ShortDatePattern: M/d/

22、yyyy ShortTimePattern: h:mm tt CurrencyDecimal: Digits : 2 Symbol : $ 三、将结构化配置挺直绑定为对象 在真正的项目开发过程中,我们都不会挺直用法挺直读取的配置,而都倾向于像我们演示的两个实例一样通过创建相应的类型(比如DateTimeFormatSettings、CurrencyDecimalSettings和FormatSettings)来定义一组相关的配置选项(Option),我们将定义配置选项(Option)的这些类型称为Option类型。在上面演示的实例中,为了创建这些封装配置的对象,我们都是采纳手工读取配置的形式,

23、假如定义的配置项太多的话,逐条读取配置项其实是一项特别繁琐的工作。 对于一个对象来说,假如我们将它的属性视为它的子节点,一个对象同样具有类似于Configuration对象的树形层次化结构。假如我们依据某个Option类型的结构来定义配置,或者反过来依据配置的结构来定义这个Option类型,那么Option类型的属性成员将与某个配置节具有一一对应的关系,那么原则上我们可以自动将配置信息绑定为一个具体的Option对象。 ASP.NET Core针对配置的Option模型(OptionModel)关心我们实现了从配置到Option对象之间的绑定,接下来我们就对此做一个简洁的演示。Option模型

24、实现在“Microsoft.Extensions.OptionModel”这个NuGet包中,除此之外,我们需要采纳依靠注入的方式来用法Option模型,所以我们需要根据如下的方式为应用添加针对相应的依靠。 . dependencies: Microsoft.Extensions.OptionsModel : 1.0.0-rc1-final, Microsoft.Extensions.DependencyInjection : 1.0.0-rc1-final , 借助于Option模型的自动绑定机制,我们无需再手工地读取配置信息,所以我们将FormatSettings、DateTimeForm

25、atSettings和CurrencyDecimalSettings的构造函数删除,只保留其属性成员。在作为程序入口的Main方法中,我们采纳如下的方式创建这个表示格式设置的FormatSettings对象。 class Program static void Main(string args) Dictionarystring, string source = new Dictionarystring, string Format:DateTime:LongDatePattern = dddd, MMMM d, yyyy, Format:DateTime:LongTimePattern =

26、h:mm:ss tt, Format:DateTime:ShortDatePattern = M/d/yyyy, Format:DateTime:ShortTimePattern = h:mm tt, Format:CurrencyDecimal:Digits = 2, Format:CurrencyDecimal:Symbol = $, ; IConfiguration configuration = new ConfigurationBuilder() .Add(new MemoryConfigurationProvider(source) .Build() .GetSection(For

27、mat); IOptionsFormatSettings optionsAccessor = new ServiceCollection() .AddOptions() .ConfigureFormatSettings(configuration) .BuildServiceProvider() .GetServiceIOptionsFormatSettings(); FormatSettings settings = optionsAccessor.Value; Console.WriteLine(DateTime:); Console.WriteLine(t0,-16: 1, LongDa

28、tePattern,settings.DateTime.LongDatePattern); Console.WriteLine(t0,-16: 1, LongTimePattern,settings.DateTime.LongTimePattern); Console.WriteLine(t0,-16: 1, ShortDatePattern,settings.DateTime.ShortDatePattern); Console.WriteLine(t0,-16: 1n, ShortTimePattern,settings.DateTime.ShortTimePattern); Consol

29、e.WriteLine(CurrencyDecimal:); Console.WriteLine(t0,-16: 1, Digits,settings.CurrencyDecimal.Digits); Console.WriteLine(t0,-16: 1, Symbol,settings.CurrencyDecimal.Symbol); 如上面的代码片段所示,我们创建一个ServiceCollection对象并调用扩展方法AddOptions注册于针对Option模型的服务。接下来我们调用Configure方法将FormatSettings这个Option类型与对应的Configuration对象进行映射。我们最终利用这个ServiceCollection对象生成一个ServiceProvider,并调用其GetService方法得到一个类型为IOptionsFormatSettings的对象,后者的Value属性返回的就是绑定了相关配置的FormatSettings对象。 以上就是本文的全部内容,盼望对大家的学习有所关心。 .

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1