我们知道,ConfigurationProvider提供将数据源转换为字典的功能,数据源可以分为很多种,比如:物理文件、数据库、内存变量等等。物理文件又包括很多种类型的文件,比如:xml、json等等。这篇文章旨在讲解各种数据源的ConfigurationProvider对象。

一、MemoryConfigurationProvider

先看下代码:

namespace Microsoft.Extensions.Configuration.Memory

{

using Microsoft.Extensions.Configuration;

using System;

using System.Collections;

using System.Collections.Generic;

public class MemoryConfigurationProvider : ConfigurationProvider, IEnumerable<KeyValuePair<string, string>>, IEnumerable

{

private readonly MemoryConfigurationSource _source;

public MemoryConfigurationProvider(MemoryConfigurationSource source)

{

if (source == null)

{

throw new ArgumentNullException("source");

}

this._source = source;

if (this._source.InitialData != null)

{

foreach (KeyValuePair<string, string> pair in this._source.InitialData)

{

string introduced2 = pair.get_Key();

base.Data.Add(introduced2, pair.get_Value());

}

}

}

public void Add(string key, string value)

{

base.Data.Add(key, value);

}

public IEnumerator<KeyValuePair<string, string>> GetEnumerator()

{

return base.Data.GetEnumerator();

}

IEnumerator IEnumerable.GetEnumerator()

{

return (IEnumerator) this.GetEnumerator();

}

}

}

可以看到,这个对象继承自ConfigurationProvider和IEnumerable<KeyValuePair<string,string>>,可以知道这个对象本身就是一个字典类型的集合,如果想添加配置可以通过Add方法直接添加。

我们知道,ConfigurationProvider是注册在ConfigurationBuilder对象之上工作的,那么它是怎么注册到这个对象上的呢?看以下代码:

namespace Microsoft.Extensions.Configuration

{

using Microsoft.Extensions.Configuration.Memory;

using System;

using System.Collections.Generic;

using System.Runtime.CompilerServices;

public static class MemoryConfigurationBuilderExtensions

{

public static IConfigurationBuilder AddInMemoryCollection(this IConfigurationBuilder configurationBuilder)

{

if (configurationBuilder == null)

{

throw new ArgumentNullException("configurationBuilder");

}

configurationBuilder.Add(new MemoryConfigurationSource());

return configurationBuilder;

}

public static IConfigurationBuilder AddInMemoryCollection(this IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string>> initialData)

{

if (configurationBuilder == null)

{

throw new ArgumentNullException("configurationBuilder");

}

MemoryConfigurationSource source = new MemoryConfigurationSource {

InitialData = initialData

};

configurationBuilder.Add(source);

return configurationBuilder;

}

}

}

通过对IConfigurationBuilder的扩展,实现把MemoryConfigurationProvider注册进来。

二、JsonConfigurationProvider

顾名思义,提供对json文件的转换,转换为数据字典。

public class JsonConfigurationProvider : FileConfigurationProvider

{

// Methods

public JsonConfigurationProvider(JsonConfigurationSource source);

public override void Load(Stream stream);

[IteratorStateMachine(typeof(<ReadLines>d__3))]

private static IEnumerable<string> ReadLines(StreamReader streamReader);

private static string RetrieveErrorContext(JsonReaderException e, IEnumerable<string> fileContent);

}

是通过以下扩展类实现对ConfigurationBuilder的添加。

public static class JsonConfigurationExtensions

{

// Methods

public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path);

public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path, bool optional);

public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, string path, bool optional, bool reloadOnChange);

public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, IFileProvider provider, string path, bool optional, bool reloadOnChange);

}

VS2015创建的带有MVC模板的.net core项目的Startup文件中用法如下:

Optioanal表示如果指定文件不存在不抛出异常而是返回一个空的字典对象。

其他的比如:XmlConfiguationProvider、IniConfigurationProvider类似,不再一一讲解。

Asp.Net Core- 多样性的配置来源的更多相关文章

  1. asp.net core 系列 10 配置configuration (上)

    一.  ASP.NET Core 中的配置概述 ASP.NET Core 中的应用配置是基于键值对,由configuration 程序提供. configuration  将从各种配置源提供程序操作键 ...

  2. ASP.NET Core开发-如何配置Kestrel 网址Urls

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

  3. asp.net core 将配置文件配置迁移到数据库(一)

    asp.net core 将配置文件配置迁移到数据库(一) Intro asp.net core 配置默认是项目根目录下的 appsettings.json 文件,还有环境变量以及 command l ...

  4. ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我 ...

  5. ASP.NET Core Windows 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Windows 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Windows 环境配置 ASP.NET Core ...

  6. (11)ASP.NET Core 中的配置一(Configuration)

    1.前言 ASP.NET Core在应用程序上引入Microsoft.Extensions.Configuration配置,可以支持多种方式配置,包括命令行配置.环境变量配置.文件配置.内存配置,自定 ...

  7. (12)ASP.NET Core 中的配置二(Configuration)

    1.内存配置 MemoryConfigurationProvider使用内存中集合作为配置键值对.若要激活内存中集合配置,请在ConfigurationBuilder的实例上调用AddInMemory ...

  8. ASP.NET Core Windows 环境配置

    ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我们将介绍 ASP.NET Core 中的一些新的概念和它们是如何帮助我们开发现代化的 Web 应用程序 尽管 ASP. ...

  9. 聊聊ASP.NET Core中的配置

    ​作为软件开发人员,我们当然喜欢一些可配置选项,尤其是当它允许我们改变应用程序的行为而无需修改或编译我们的应用程序时.无论你是使用新的还是旧的.NET时,可能希望利用json文件的配置.在这篇文章中, ...

  10. 翻译 - ASP.NET Core 基本知识 - 配置(Configuration)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0 ASP ...

随机推荐

  1. R语言学习笔记:矩阵与数组(array)

    元素可以保存在多个维度的对象中,数组存储的是多维数据元素,矩阵的是数组的特殊情况,它具有两维. 创建数组的几种方法. 1. > m<-c(45,23,66,77,33,44,56,12,7 ...

  2. eay ui iframe 下常问题

    背景:客户要使用https进行登录,把原来的登录做到一个小框,用iframe嵌进来进行登录. 客户拥有4个域名,但只在xxx.com域名中购买了安全证书,所以多个域名下登录所用的iframe中src是 ...

  3. raid之理解

    RAID方案有两种,一种是硬件RAID解决方案,一种是软RAID解决方案. 硬件RAID解决方案 1.RAID 0 RAID 0是最早出现的RAID模式,即Data Stripping数据分条技术.R ...

  4. request对象常用API 获取请求参数的值 request应用 MVC设计模式

    1 request对象常用API   1)表示web浏览器向web服务端的请求   2)url表示访问web应用的完整路径:http://localhost:8080/day06/Demo1     ...

  5. 不只是技术!成为IT经理必备的十大软技能

    摘要:可能你是一名普通的IT从业员,一个小小的程序员,可随着社会的发展和科技的进步,对人才的要求越来越高,你可能通过技术获得了职位,但你若想升职加薪却少不了软技能:谈判技巧.积极倾听.演讲技巧以及领导 ...

  6. 【HDOJ】2385 Stock

    水题,逆向做+优先级队列. /* 2385 */ #include <iostream> #include <sstream> #include <string> ...

  7. js模仿jquery里的几个方法next, pre, nextAll, preAll

    /*siblings函数, 选取node的所有兄弟节点*/ function siblings(node){ if(node.nodeType === 1){ node.flag = true; // ...

  8. 谈数据库索引和Sqlite中索引的使用

    要使用索引对数据库的数据操作进行优化,那必须明确几个问题:1.什么是索引2.索引的原理3.索引的优缺点4.什么时候需要使用索引,如何使用围绕这几个问题,来探究索引在数据库操作中所起到的作用. 1.数据 ...

  9. UVa 201 Squares

    题意: 给出这样一个图,求一共有多少个大小不同或位置不同的正方形. 分析: 这种题一看就有思路,最开始的想法就是枚举正方形的位置,需要二重循环,枚举边长一重循环,判断是否为正方形又需要一重循环,复杂度 ...

  10. SDOI2012Longge的问题

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 930  Solved: 601[Submit][St ...