Net Core- 配置组件

我们之前写的配置都是放置在配置文件Web.config或者app.config中,.net core提供了全新的配置方式,可以直接写在内存中或者写在文件中。

.Net Core的配置API主要体现在3个类中Configuration、ConfigurationBuilder、ConfigurationProvider中。

配置文件其实就是一个键值对。Configuration以树形结构描述了这些键值对之间的关系。我们的配置文件比如project.json是怎么转换成Configuration树形结构的呢?

Microsoft.Extensions.Options这个命名空间下的类提供了文件向Configuration的转换。

一、配置文件分为3种结构

1. 逻辑结构:就是我们看到的结构,树形结构。

2. 原始结构:就是文件本身的结构,比如xml、json等等。

3. 物理结构:介于两者之间的结构,键值对。

配置组件的最终目的就是把原始结构转化成逻辑结构,在具体转换过程中,先找到对应的ConfigurationProvider转化为物理结构数据字典,然后再由ConfigurationBuilder转化为逻辑结构Configuration对象。

二、Configuration

Configuration对象泛指继承自接口IConfiguration的对象。这个接口如下:

 

这个接口GetChildren表示所有的ConfigurationSection对象;GetSection根据key值得到ConfigurationSection对象。

继承自这个接口的对象分别是ConfigurationRoot和ConfigurationSection,分别表示配置的根节点和叶子节点。

ConfigurationRoot还继承自接口IConfigurationRoot接口,代码如下:

这个接口只有一个方法Reload重新加载,当调用这个方法的时候,在这棵树下的所有的节点都会重新加载。

ConfigurationSection还继承自IConfigurationSection,代码如下:

Key表示父节点的名称;Path表示当前节点的路径,用“:”隔开;Value只有在叶子节点才有值,非叶子节点返回Null。

三、ConfigurationProvider

ConfigurationProvider对象泛指实现了接口IConfigurationProvider的对象。

而继承自这个接口的是一个抽象类ConfigurationProvider,代码如下:

因为这个类的最终目的就是转化为数据字典,所以,这个类的方法大部分都是针对数据字典,方法的参数中都有key值。

不同的数据源都是继承自这个抽象类,重写自己的方法。

Load方法从数据源加载数据,针对不同的数据源子类可以重写;TryGet根据key值获取数据值;Set方法设置数据值,因为这个类的主要功能是从数据源读取数据转化为数据字典,所以Set的值只保存在内存中。

四、ConfigurationBuilder

泛指实现了接口IConfigurationBuilder的对象。他的作用就是根据ConfigurationProvider提供的数据字典,把数据字典转化为ConfigurationRoot对象。接口如下:

主要通过Build方法实现把数据字典转化为ConfigurationRoot。

无论是ConfigurationRoot还是ConfigurationSection本身都没有封装任何形式的对配置的读取操作,所有的读取操作都是在ConfigurationProvider对象中。

在ConfigurationRoot和ConfigurationSection组成的树形结构中,并没有在代码中直接保存这种结构,而是每个ConfigurationSection中都有一个ConfigurationRoot对象,直接是对根节点的引用。而只有根节点中有对ConfigurationProvider的调用。也就是在每个叶子节点中都有一个对于根节点的引用。这样当我们想要获取某个节点的具体值时,先找到根节点,再通过根节点找到ConfigurationProvider,通过ConfigurationProvider对象获取配置值。

还有一个对象ConfigurationPath,主要封装对树层级结构的计算,代码如下:

Combine方法实现把路径连接成一个完整的路径。

以上对象之间的关系图如下:

综上,配置模块的最终目的是要把原始的配置文件比如:json、xml转换为一个ConfigurationRoot对象,这个对象是一个树形结构,下边是ConfigurationSection对象。当我们要获取某个配置时,通过ConfigurationRoot的ConfigurationProvider获取,每个ConfigurationSection都有一个对于根节点的引用。

参考链接:http://www.cnblogs.com/artech/p/asp-net-core-config-01.html

 
分类: ASP.NET Core

Net Core- 配置组件的更多相关文章

  1. net core体系-web应用程序-4net core2.0大白话带你入门-7asp.net core日志组件(Logger和Nlog)

    asp.net core日志组件   日志介绍 Logging的使用 1. appsettings.json中Logging的介绍 Logging的配置信息是保存在appsettings.json配置 ...

  2. ASP.NET Core 配置 MVC - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 MVC - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 MVC 前面几章节中,我们都是基于 ASP.NET 空项目 ...

  3. .NET Core开源组件:后台任务利器之Hangfire 转载 https://www.cnblogs.com/chenug/p/6655636.html

    .NET Core开源组件:后台任务利器之Hangfire   一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的D ...

  4. .NET 开源配置组件 AgileConfig 初体验

    介绍 在微服务大行其道的今天,系统会被拆分成多个模块,作为单独的服务运行,同时为了集中化管理,我们还需要日志中心,配置中心等,很多开发人员可能更熟悉 ApolloConfig,这个组件功能也很完善,d ...

  5. ASP.NET Core配置Kestrel 网址Urls

    ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Urls,使用多种方式配置Urls.让 ...

  6. 10分钟就能学会的.NET Core配置

    .NET Core为我们提供了一套用于配置的API,它为程序提供了运行时从文件.命令行参数.环境变量等读取配置的方法.配置都是键值对的形式,并且支持嵌套,.NET Core还内建了从配置反序列化为PO ...

  7. 实现自己的.NET Core配置Provider之EF

    <10分钟就能学会.NET Core配置>里详细介绍了.NET Core配置的用法,另外我还开源了自定义的配置Provider:EF配置Provider和Yaml配置Provider.本文 ...

  8. 实现自己的.NET Core配置Provider之Yaml

    YAML是一种更适合人阅读的文件格式,很多大型的项目像Ruby on Rails都选择YAML作为配置文件的格式.如果项目的配置很少,用JSON或YAML没有多大差别.看看rails项目中的配置文件, ...

  9. 【转】10分钟就能学会的.NET Core配置

    .NET Core为我们提供了一套用于配置的API,它为程序提供了运行时从文件.命令行参数.环境变量等读取配置的方法.配置都是键值对的形式,并且支持嵌套,.NET Core还内建了从配置反序列化为PO ...

  10. net core体系-web应用程序-4net core2.0大白话带你入门-4asp.net core配置项目访问地址

    asp.net core配置访问地址  .net core web程序,默认使用kestrel作为web服务器. 配置Kestrel Urls有四种方式,我这里只介绍一种.其它方式可自行百度. 在Pr ...

随机推荐

  1. 关于Condition Variable的一些思考

    可能大家都使用过condition variable(之后称cv),一些博客也对cv做了介绍,但是有的说的不完全正确,甚至有误导使用者的倾向,其实最合理的使用方式是查阅文档, 如果你英语还ok的话,h ...

  2. Struts2问题,已解决No result defined for action and result input

    struts2.1.8 必须在struts.xml中配置namespace属性 如果你在2.0中一切OK,但是在2.1中确出现了No result defined for action的异常,就是在因 ...

  3. Android GridView(九宫图)

    GridView跟ListView都是比较常用的多控件布局,而GridView更是实现九宫图的首选! <?xml version="1.0" encoding="u ...

  4. Linux网络管理——子网掩码

    1. 网络基础 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB",&q ...

  5. attribute和property兼容性分析

    上一篇文章中,详细的分析了他们的区别,请看Javascript中的attribute和property分析 这次,来详细的看下他们的兼容性,这些内容主要来自于对于jQuery(1.9.x)源代码的分析 ...

  6. 读取本地HTML的小说阅读器应用源码项目

    该源码是一个不错的读取本地HTML的小说阅读器,读取本地HTML的小说阅读器,并且源码也比较简单的,非常适合我们的新手朋友拿来学习,有兴趣的朋友研究下. 源码下载: http://code.662p. ...

  7. scss + react + webpack + es6

    scss + react + webpack + es6 写在前面: 刚学习完慕课网里的一个幻灯片案例,自己加了刚学的react,两者结合.首先让大家看看效果 点击此处 你可以先用纯js实现上面的效果 ...

  8. html中上标、下标、删除字、小号字等

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. Delphi 的接口机制——接口操作的编译器实现过程(2)

    接口对象的内存空间 假设我们定义了如下两个接口 IIntfA 和 IIntfB,其中 ProcA 和 ProcB 将实现为静态方法,而 VirtA 和 VirtB 将以虚方法实现: IIntfA =  ...

  10. android 传感器使用 Compass指南针的实现功能

    以下是指南针通过方向传感器而旋转实现. CompassDemo.java: package com.example.activity; import android.app.Activity; imp ...