我们知道,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. 1067. Disk Tree(字符串)

    1067 破题啊  写完发现理解错题意了 子目录下会有跟之前重名的 把输入的字符串存下来 排下序 然后依次找跟上面有没有重的 #include <iostream> #include< ...

  2. php 类 成员变量 $this->name='abc'

    <?php class test { public function getName() { $this->name='abc'; echo $this->name; } }$a=n ...

  3. 数论/the first wave

    线性筛素数(原来我之前学的不是线性的啊... void getprime(){ rep(i,2,nmax){ if(!vis[i]) prime[++prime[0]]=i; for(int j=1; ...

  4. [POJ 3370] Halloween treats

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7143   Accepted: 2641 ...

  5. Office启动加载vs。。。项

    PowerPoint: 选项->加载项->Chinese Translation Addin->管理[COM加载项]转到->取消Chinese Translation Addi ...

  6. 深入解析Java对象的hashCode和hashCode在HashMap的底层数据结构的应用

    转自:http://kakajw.iteye.com/blog/935226 一.java对象的比较 等号(==): 对比对象实例的内存地址(也即对象实例的ID),来判断是否是同一对象实例:又可以说是 ...

  7. Windows安装weblogic

    WebLogic安装结束 以下是进入MyEclipse启动配置WebLogic

  8. NET下RabbitMQ实践[实战篇]

    之前的文章中,介绍了如何将RabbitMQ以WCF方式进行发布.今天就介绍一下我们产品中如何使用RabbitMQ的!          在Discuz!NT企业版中,提供了对HTTP错误日志的记录功能 ...

  9. Ubuntu上搭建Watir-Webdriver与Cucumber环境

    本文主要演示如何在Ubuntu上搭建Watir-Webdriver与Cucumber环境,用于自动化测试. 1. Ubuntu环境 A. 安装 因为我的工作机是Windows,所以采用虚拟机的方式使用 ...

  10. IOS学习笔记1`

    写了IOS的Hello World,记事本写的.除了一些基本的语法外,最主要的收获就是路径问题了. 直接把文件拖入终端,就会显示文件的完全限定名了.