我们知道,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. 功能齐全、效率一流的免费开源数据库导入导出工具(c#开发,支持SQL server、SQLite、ACCESS三种数据库),每月借此处理数据5G以上

    软件名:DataPie 功能:支持SQL server.SQLite.ACCESS数据库的导入.导出.存储过程调用,支持EXCEL2007.EXCEL2003.ACCESS2007. CSV文件导入数 ...

  2. WinAPI——钩子函数大全3

    函数原形:LRESULT CALLBACK JournalPlaybackProc(int code, WPARAM wParam, LPARAM lParam); 参数: code:指示一个代码,被 ...

  3. Java线程池的工作原理与实现

    简单介绍 创建线程有两种方式:继承Thread或实现Runnable.Thread实现了Runnable接口,提供了一个空的run()方法,所以不论是继承Thread还是实现Runnable,都要有自 ...

  4. CodeForces Round #290 Div.2

    A. Fox And Snake 代码可能有点挫,但能够快速A掉就够了. #include <cstdio> int main() { //freopen("in.txt&quo ...

  5. bzoj2243:[SDOI2011]染色

    链剖就可以了.一开始的想法错了.但也非常接近了.妈呀调的要死...然后把字体再缩小一号查错起来比较容易QAQ. #include<cstdio> #include<cstring&g ...

  6. spring data jpa入门学习

    本文主要介绍下spring data jpa,主要聊聊为何要使用它进行开发以及它的基本使用.本文主要是入门介绍,并在最后会留下完整的demo供读者进行下载,从而了解并且开始使用spring data ...

  7. Python中,如何初始化不同的变量类型为空值

    参考文章  Python中,如何初始化不同的变量类型为空值 常见的数字,字符,很简单,不多解释. 列表List的其值是[x,y,z]的形式 字典Dictionary的值是{x:a, y:b, z:c} ...

  8. MessagePack介绍

    在项目中,服务端的人需要我研究messagepcak 进行数据的传输,对messagePack的了解就是传输的数据格式都是二进制,可以节省用户的流量,就因为这点 数据格式小,服务端决定采用msgpac ...

  9. 430的启动,I/O中断

    感言:看了这一集MSP430的讲解之后,我才知道msp430真的和arm7没什么区别了,可能在某些功能上要比arm7要优秀 1:430的系统复位和初始化初始化 430的系统复位有两个来源 1:POR上 ...

  10. Android UI -- 的基础知识。

    在介绍基础知识之前先明确几个基本的概念 View 视图是所有可视组件的基类,所有的UI控件包括布局类都是从View派生出来的. ViewGroup ViewGroup是View的扩展,可以放置多个Vi ...