提到“配置”二字,我想绝大部分.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跨平台或扫描二维码关注

ASP.NET Core的配置(1):读取配置信息相关推荐

  1. .Net Core 自定义配置源从配置中心读取配置

    配置,几乎所有的应用程序都离不开它..Net Framework时代我们使用App.config.Web.config,到了.Net Core的时代我们使用appsettings.json,这些我们再 ...

  2. ASP.NET Core应用程序的参数配置及使用

    应用程序的开发不仅仅是写代码这点事情.假设你正在开发一个能够支持多次部署的微服务,此时你就需要有一个合理的应用程序配置方案,以便在开发和生产环境中能够方便地选用不同的配置参数,并且能够在部署到容器服务 ...

  3. ASP.NET Core(十)Configuration 配置优先级详解

    ASP.NET Core 项目启动,默认执行顺序为:宿主 Host -> 读取配置 -> 日志设置 -> 注册服务(DI)-> 添加中间件 -> WebHost 监听 - ...

  4. 如何在 ASP.NET Core 中为同一接口配置不同的实现

    前言 通常,我们使用依赖注入时,一个接口仅对应一种实现,使用时可以直接得到实现类的实例,类似这样: services.AddScoped<IServiceA,ServiceA>();pub ...

  5. seata-server没有从nacos配置中心读取配置_微服务新秀之Nacos,看了就会,我说的

    再讲 Nacos 之前,我们需要了解什么是 Nacos:Nacos 是阿里的一个开源产品,它是针对微服务架构中的 服务发现.配置管理.服务治理 的综合性解决方案. 官网给出的回答: Nacos 致力于 ...

  6. ASP.NET Core SignalR实时推送配置,业务层实时推送SignalR消息

    web框架版本:.NET 6 不需要安装nuget有关signalr的包 微软参考文档: https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/ ...

  7. Asp.Net Core 2.1 取消HTTPS配置

    1.创建Core Web项目时,默认勾选了HTTPS,如下所示 2.右键项目-属性-调试,如下所示 3.如果不去掉会出现如下一种情况 比如:本地运行起来的是https://localhost:5000 ...

  8. ASP.NET CORE WebAPI 中 Route 属性配置

    1 访问路径属性  Route public class OrdersController : ApiController {[Route("customers/{customerId}/o ...

  9. ASP.NET Core实现类库项目读取配置文件

    前言 之前继续在学习多线程方面的知识,忽然这两天看到博问中有个园友问到如何在.net core类库中读取配置文件,当时一下蒙了,这个提的多好,我居然不知道,于是这两天了解了相关内容才有此篇博客的出现, ...

  10. php asp.net core,asp.net core实例教程之配置

    Asp.Net Core-配置Asp.Net Core-配置 在这一章,我们将讨论 ASP.NET Core项目的相关的配置.在解决方案资源管理器中,您将看到 Startup.cs 文件.如果你有以前 ...

最新文章

  1. 可作为工质状态参数的是_制冷工质的热力状态参数都有哪些?
  2. Android使用百度地图定位
  3. [BUUCTF-pwn]——铁人三项(第五赛区)_2018_rop
  4. Android MVP 框架
  5. mysql 多表查询 join on_MySQL多表查询Left Join,Right Join学习笔记
  6. CSS 全解析实战(一)-导读
  7. Linux学习-0927
  8. React:基础知识学习
  9. 多元统计分析朱建平pdf_应用多元统计分析课后答案朱建平版
  10. hosts文件是什么? Windows、Mac、Linux的hosts文件在哪里?
  11. tp801单板微型计算机英文全称,TP801型微型计算机在低压铸造与差压铸造液面加压控制系统中的应用.pdf...
  12. 【微信小程序】微信公众平台合法域名设置
  13. 数据结构——树-基本知识点(第六章)
  14. 异步爬取有道词典(入门js逆向)
  15. Android开发 TextView
  16. android移动支付——银联支付
  17. 关于高德地图问题总结 (二)地理围栏的使用
  18. js图片上传功能前端
  19. 手动搭建T版openstack平台(不会你还不学)
  20. 学生用计算机坏了怎么办,电脑坏了,我来教你怎么处理!修电脑再也不求人!...

热门文章

  1. JSTL分割字符 fn:split()
  2. 为什么这个SQL Server DBA学习PowerShell--SQL任务
  3. .NET遗留应用改造——性能优化篇
  4. WTMPlus 1.4 Uniapp来了
  5. 推荐:Flowchart 一种通过文本方式描述的流程图
  6. 愚蠢的领导才会用程序员祭天!!
  7. 面向.NET开发人员的Dapr- actors 构建块
  8. 使用 KubernetesClient 操作 kubernetes
  9. 基于 C# 的 ETL 大数据并行编程
  10. 不仅性能秒杀Hadoop,现在连分布式集群功能也开源了