ASP.NET Core的配置(1):读取配置信息

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

由于很多人都不曾接触过这个采用全新设计的配置系统,为了让大家对此有一个感官的认识,我们先从编程的角度对它作一个初体验。针对配置的API涉及三个对象,它们分别是Configuration、ConfigurationBuilder和ConfigurationProvider,配置模型中具有相应的接口来表示它们。这三个对象之间的关系很清晰,Configuration对象承载着在编程过程中使用的配置信息,ConfigurationProvider则是配置信息原始数据源的提供者,两者之间沟通由ConfigurationBuilder来完成,它利用ConfigurationProvider提取源数据将其转换为Configuration对象。

一、以键-值对的形式读取配置

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


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


要创建一个体现当前配置的DateTimeFormatSettings对象,我们必须向得到这个承载相关配置信息的Configuration对象。正如我们上面所说,Configuration对象是由ConfigurationBuilder创建的,而原始的配置信息则是通过相应的ConfigurationProvider来读取的,所以创建一个Configuration对象的正确编程方式是先创建一个ConfigurationBuilder对象,然后为之添加一个或者多个ConfigurationProvider对象,最后利用ConfigurationBuilder来创建我们需要的Configuration对象。

按照上述的编程模式,我们在一个控制台应用中编写了如下的程序。我们创建了一个类型为ConfigurationBuilder的对象,调用其Add方法添加的ConfigurationProvider是一个类型为MemoryConfigurationProvider的对象。顾名思义,MemoryConfigurationProvider利用内存中的对象来提供原始的配置信息,具体来说这些原始的配置信息保存在一个元素类型为KeyValuePair<string, string>的集合之中。我们最终调用ConfigurationBuilder的Build方法获取用于创建DateTimeFormatSettings对象所需的Configuration。


为了验证根据配置创建的DateTimeFormatSettings对象与配置原始数据之间的关系,我们将它的四个属性输出于控制台上。当这个程序执行之后将在控制台上产生如下所示的输出,可以看出它正是我们提供的配置的真实反映。


二、 读取结构化的配置

真实项目中涉及的配置大都具有一个结构化的层次结构,所以在配置模型中的Configuration对象同样具有这样的结构。结构化的配置具有一个树形层次结构,而一个Configuration对象表示的是组成这棵配置树的某个节点,这棵配置树则可以通过作为根节点的Configuration对象来体现。体现为键值对的原子配置项一般至存在于作为叶子节点的Configuration对象中,非叶子节点的Configuration包含一组子节点,而每个子节点同样是一个Configuration对象。

接下来我们同样以实例的方式来演示如何定义并读取具有层次化结构的配置。我们依然沿用上一节的应用场景,现在我们不仅仅需要设置日期/时间的格式,还需要设置其他数据类型的格式,比如表示货币的Decimal类型。为此我们定义了如下一个CurrencyDecimalFormatSettings类,它的属性Digits和Symbol分别表示小数位数和货币符号,一个CurrencyDecimalFormatSettings对象依然是利用一个表示配置的Configuration对象来创建的。


我们定义了另一个名为FormatSettings的类型来表示针对不同数据类型的格式设置。如下面的代码片段所示,它的两个属性DateTime和CurrencyDecimal分别表示针对日期/时间和货币数字的格式设置。FormatSettings依然具有一个参数类型为IConfiguration接口的构造函数,它的两个属性均在此构造函数中被初始化。值得注意的是初始化这两个属性采用的是当前Configuration的“子配置节”,通过指定配置节名称调用GetSection方法获得。


在我们上面演示的实例中,我们通过以一个MemoryConfigurationProvider对象来提供原始的配置信息。由于承载原始配置信息的是一个元素类型为KeyValuePair<string, string>的集合,所以原始配置在物理存储上并不具有树形化的层次结构,那么它如何能够最终提供一个结构化的Configuration对象呢?其实很简单,虽然MemoryConfigurationProvider对象只能将配置信息存储为简单的“数据字典”,但是如果将Configuration对象在配置树中体现的路径作为Key,这个数据字典在逻辑上实际上就具有了一棵树的结构。实际上MemoryConfigurationProvider就是这么做的,这体现在我们如下所示的程序之中。


如上面的代码片段所示,创建MemoryConfigurationProvider对象采用的字典对象包含6个基本的配置项,为了让它们在逻辑上具有一个树形化层次结构,所以的Key实际上体现了每个配置项所在配置节在配置树中的路径,路径采用冒号(“:”)进行分割。改程序执行之后会在控制台上呈现如下所示的输出结果。


三、将结构化配置直接绑定为对象

在真正的项目开发过程中,我们都不会直接使用直接读取的配置,而都倾向于像我们演示的两个实例一样通过创建相应的类型(比如DateTimeFormatSettings、CurrencyDecimalSettings和FormatSettings)来定义一组相关的配置选项(Option),我们将定义配置选项(Option)的这些类型称为Option类型。在上面演示的实例中,为了创建这些封装配置的对象,我们都是采用手工读取配置的形式,如果定义的配置项太多的话,逐条读取配置项其实是一项非常繁琐的工作。

对于一个对象来说,如果我们将它的属性视为它的子节点,一个对象同样具有类似于Configuration对象的树形层次化结构。如果我们根据某个Option类型的结构来定义配置,或者反过来根据配置的结构来定义这个Option类型,那么Option类型的属性成员将与某个配置节具有一一对应的关系,那么原则上我们可以自动将配置信息绑定为一个具体的Option对象。

ASP.NET Core针对配置的Option模型(OptionModel)帮助我们实现了从配置到Option对象之间的绑定,接下来我们就对此做一个简单的演示。Option模型实现在“Microsoft.Extensions.OptionModel”这个NuGet包中,除此之外,我们需要采用依赖注入的方式来使用Option模型,所以我们需要按照如下的方式为应用添加针对相应的依赖。


借助于Option模型的自动绑定机制,我们无需再手工地读取配置信息,所以我们将FormatSettings、DateTimeFormatSettings和CurrencyDecimalSettings的构造函数删除,只保留其属性成员。在作为程序入口的Main方法中,我们采用如下的方式创建这个表示格式设置的FormatSettings对象。

 

如上面的代码片段所示,我们创建一个ServiceCollection对象并调用扩展方法AddOptions注册于针对Option模型的服务。接下来我们调用Configure方法将FormatSettings这个Option类型与对应的Configuration对象进行映射。我们最后利用这个ServiceCollection对象生成一个ServiceProvider,并调用其GetService方法得到一个类型为IOptions<FormatSettings>的对象,后者的Value属性返回的就是绑定了相关配置的FormatSettings对象。

原文地址:http://www.cnblogs.com/artech/p/asp-net-core-config-01.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329626.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EL调用java方法

一、jstl函数 jstl函数自定义二、调用方法的值成变量 第一种使用request对象 <% request.setAttribute(“isOperate”,isShowOperate()); %> 第二种使用标签变量 <c:set var"isOperate" value"<%isShowOperate()%>" />转换成变量使用<…

wordcloud python3.7_[原创]win7/64位系统+python3.7.2下安装wordcloud库失败之解决——一个莫名其妙的方法...

当前环境&#xff1a;win7/64位系统python3.7.2pip-19.2.1使用pip install wordcould安装时出现错误&#xff0c;提示&#xff1a;尝试方法①&#xff1a;考虑更换其他安装源提示没有变化&#xff0c;仍然提示没有找到分发版本-----------强行插入的分割线-------------------(…

1-计算机系统概论

【README】 本文总结自B站 《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1.1】计算机软硬件概念 【1.2】计算机层次结构 【2】计算机基本组成 【2.1】冯诺依曼计算机特点&#xff08;重要*&#…

JetBrains 加入 .NET 基金会

在 BUILD 大会上&#xff0c;微软正式对外宣布&#xff0c;JetBrains 已经加入 .NET 基金会&#xff0c;详细情况可以查看 .NET Foundation 博客。 JetBrains 因为用户推荐、ReSharpe、ReSharper Ultimate 套件等原因&#xff0c;在 .NET 平台投入大量资源。而现在&#xff0c…

jstl中添加自定义的函数

转载自 jstl中添加自定义的函数由于jstl中提供的函数未必能够满足我们的要求&#xff0c;而我们又希望能够像jstl提供的函数那样能够轻松方便使用&#xff0c;那么可以通过自定义函数补充jsltl函数。给jstl添加自定义函数需要以下步骤&#xff1a;定义一个static的public的方…

多智能体强化学习_基于多智能体强化学习主宰星际争霸游戏

大家好&#xff0c;今天我们来介绍基于多智能体强化学习主宰星际争霸游戏这篇论文Grandmaster level in StarCraft II using multi-agent reinforcement learning​doi.org从Alphastar以后 利用强化学习的方法进行星际争霸2AI的又一大突破。Part1 前言游戏介绍(Introduction to…

2-计算机发展及应用

【README】 本文总结自B站 《计算机组成原理&#xff08;哈工大刘宏伟&#xff09;》的视频讲解&#xff0c;非常棒&#xff0c;墙裂推荐&#xff1b; 【1】计算机发展史 【1.1】计算机的产生和发展 【1.2】微型计算机的出现与发展 芯片上的晶体管的数量 与 cpu速度间 有没有关…

ASP.NET Core的配置(2):配置模型详解

在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式&#xff0c;其中涉及到三个重要的对象&#xff0c;它们分别是承载结构化配置信息的Configuration&#xff0c;提供原始配置源数据的ConfigurationProvider&#xff0c;以及作为“中间人”的ConfigurationBuilder。…

Mysql的安装与远程登录

一、安装 &#xff08;1&#xff09;linux版A.linux普通版http://www.jb51.net/article/104107.htmB.ubuntu版 1.安装 sudo apt-get install mysql-server apt-get isntall mysql-client sudo apt-get install libmysqlclient-dev2.设置密码cd /etc/mysql vi debian.cnf ,得…

sqlserver如何定义一个静态变量_[Bazel]自定义规则实现将多个静态库合并为一个动态库或静态库...

1 前言2 自定义规则实现2.1 规则功能2.2 实现规则的理论基础2.3 规则代码实现3 总结4 参考资料1 前言为了实现如标题所述的将多个静态库合并为一个动态库&#xff0c;内置的 Bazel 规则是没有这个功能的&#xff0c;Bazel C/C 相关的内置规则有&#xff1a;cc_binary &#xff…

(转)base64编码(严格说来,base64不算作加解密算法)

【README】 1.本文转自&#xff1a; Java base64加密解密 - xuwc - 博客园参考&#xff1a; https://www.cnblogs.com/luguo3000/p/3940197.html https://blog.csdn.net/jiahao1186/article/detailhttps://www.cnblogs.com/xuwc/p/14058183.htmlhttps://zh.wikipedia.org/wik…

JavaWeb的web.xml标签元素(一)

普通信息标签 &#xff08;1&#xff09;display-name 定义了WEB应用的名字,在servletContextConfig display-name* XML语法&#xff1a;<display-name>AppName</display-name> &#xff08;2&#xff09;description 可以使用description元素来提供有关部署描述符…

python3多线程第三方库_Python3 多线程

Python3 多线程多线程类似于同时执行多个不同程序&#xff0c;多线程运行有如下优点&#xff1a;使用线程可以把占据长时间的程序中的任务放到后台去处理。用户界面可以更加吸引人&#xff0c;比如用户点击了一个按钮去触发某些事件的处理&#xff0c;可以弹出一个进度条来显示…

采用MiniProfiler监控EF与.NET MVC项目

今天来说说EF与MVC项目的性能检测和监控&#xff0c;相对本篇文章&#xff0c;更推荐大家使用另一个类似组件 NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇 首先,先介绍一下今天我们使用的工具吧. MiniProfiler~ 这个东西的介绍如下: MVC MiniProfiler是Stack Ove…

(转)公钥,私钥和数字签名这样最好理解

转自&#xff1a; 公钥&#xff0c;私钥和数字签名这样最好理解_21aspnet的博客-CSDN博客_公钥签名还是私钥签名一、公钥加密 假设一下&#xff0c;我找了两个数字&#xff0c;一个是1&#xff0c;一个是2。我喜欢2这个数字&#xff0c;就保留起来&#xff0c;不告诉你们(私钥…

JavaWeb的web.xml标签元素(二)

JavaWeb的web.xml标签元素&#xff08;一&#xff09; 九、session-config为Web应用中的javax.servlet.http.HttpSession对象定义参数 session-config-session-timeout?session-timeout元素用来指定默认的会话超时时间间隔&#xff0c;以分钟为单位。该元素值必须为整数。如果…

登录系统 提示框_实物资产管理软件操作手册(职员和系统用户)

一、职员和系统用户“职员和系统用户”菜单提供了对公司人员信息进行维护的功能&#xff0c;可以自定义职员编码、 姓名、用户名等相关职员信息。注意&#xff1a;职员编码、用户名需唯一&#xff0c;且用户名一旦保存则不可修改。根据要求可以将“用户类型”分为“职员”和“系…

HoloLens开发手记-凝视 Gaze

凝视 Gaze 在全息应用中&#xff0c;凝视是第一种输入形式&#xff0c;被用于定位物体&#xff08;功能和PC的光标指针类似&#xff09;。凝视告诉你用户正在看向世界中的位置&#xff0c;让你能够确定他们的意图。在现实世界中&#xff0c;你通常会盯着你打算与之交互的物体。…

摘要算法与加密(以MD5算法为例)

【README】 部分内容总结自&#xff1a; 摘要与加密的区别&#xff08;以MD5算法为例&#xff09; - 掘金https://juejin.cn/post/6844903561478799368 【1】摘要算法与加密区别 【1.1】摘要算法&#xff08;不可逆&#xff09; 1&#xff09;摘要算法&#xff1a; 说白了…

Oracle入门(三A)之sqlplus

转载自 sqlplus /nolog是什么意思sqlplus命令格式如下&#xff1a; 用法: SQLPLUS [ [<option>] [<logon>] [<start>] ] 其中 <option> :: -H | -V | [ [-M <o>] [-R <n>] [-S] ] <登录> :: <用户名>[/<口令>][<con…