ASP.NET

推荐列表 站点导航

当前位置:首页 > 脚本编程 > ASP.NET >

ASP.NET Core如何自定义配置源示例详解

来源:网络整理  作者:网友投稿  发布时间:2020-12-27 12:34
这篇文章主要给大家介绍了关于ASP.NET Core如何自定义配置源的相关资料,文中通过示例代码介绍的非常详细,对大家...

正如大家所知,在 .NET Core 中配置文件改成了 appsettings.json,表面上和 .NET Framework 的 web.config 或 app.config 好像没有太大的区别,只是一种是 json ,一种是 xml,但其实 .NET Core 的配置体系是一种全新的设计,灵活且具扩展性。这里主要介绍一下在 .NET Core 的配置体系下如何扩展自定义配置源,配置源其实就是配置信息存放的载体,最常用的就是文件类型。

.NET Core 配置体系

在进行自定义配置源介绍前,我们需要先了解一下 .NET Core 中的配置体系。 .NET Core 的配置体系中主要包含 ConfigurationProvider、ConfigurationSource、ConfigurationBuilder、Configuration 几大核心对象。

ConfigurationProvider

实现 IConfigurationProvider 接口,配置源真正提供者,主要提供配置信息的加载与刷新。

ConfigurationSource

实现 IConfigurationSource 接口,提供对应的 ConfigurationProvider 具体实例。

ConfigurationBuilder

实现 IConfigurationBuilder 接口,负责将 ConfigurationSource 添加到配置源集合,再根据配置源集合构建出 ConfigurationRoot 对象,实现 IConfigurationRoot 接口。

Configuration

实现 IConfiguration 接口,Configuration 对象在逻辑上体现出树形化层次结构,配置信息均已键/值对的方式提供使用。

:*IConfigurationRoot 、IConfigurationSection 均继承于 IConfiguration,IConfigurationRoot 表示配置的根节点,IConfigurationSection 则表示配置的非根节点*

所以他们之间的关系就是 ConfigurationProvider 实现配置提供,然后通过 ConfigurationSource 构造配置源实例,接着通过 ConfigurationBuilder 将配置源实例 ConfigurationSource 添加到配置源集合中并构造出 ConfigurationRoot,最终以 Configuration 对象提供给程序使用。

ASP.NET Core如何自定义配置源示例详解

默认情况下,Configuration 对象的 Providers 属性包含如下 Provider:

ASP.NET Core如何自定义配置源示例详解

ChainedConfigurationProvider:应用程序本身相关配置信息,如:applicationName、contentRoot;

JsonConfigurationProvider:appsettings.json 和 appsettings.Development.json 中的配置信息;

EnvironmentVariablesConfigurationProvider:环境变量的配置信息;

CommandLineConfigurationProvider:命令行输入的配置信息;

这些类型的 Provider 在 .NET Core Web 项目中默认会自动加载,不需要手动配置,当然预置的 Provider 并不止这几种。

自定义配置源

前面提到 .NET Core 的配置体系是具有扩展性的,所以我们可以实现自定义的配置源,比如基于配置中心(如:etcd、apollo、consul 等)的实现,下面将模拟从配置中心获取,先了解整体实现方式,后面也会介绍我们在实际项目中基于 etcd 的实现方案。

创建 ConfigurationProvider

自定义 Provider 需要继承 ConfigurationProvider,然后重写 Load 方法,设置 Data 属性。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

 

public class CustomConfigurationProvider : ConfigurationProvider

{

 public override void Load()

 {

 // 模拟从远程配置中心获取配置信息

 using var httpClient = new HttpClient

 {

 BaseAddress = new Uri(":5000")

 };

 

 var response = httpClient.GetStringAsync("/api/configs")

 .ConfigureAwait(false)

 .GetAwaiter()

 .GetResult();

 

 if (!string.IsNullOrEmpty(response))

 {

 Data = JsonConvert.DeserializeObject<Dictionary<string, string>>(response);

 }

 }

}

 

:5000/api/configs 接口返回的 json 字符串,如下:

1

 

{"name":"beck","company":"mingdao"}

 

创建 ConfigurationSource

实现 IConfigurationSource 接口,在 Build 方法中返回 CustomConfigurationProvider 实例。

1

2

3

4

5

6

7

 

public class CustomConfigurationSource : IConfigurationSource

{

 public IConfigurationProvider Build(IConfigurationBuilder builder)

 {

 return new CustomConfigurationProvider();

 }

}

 

加入 ConfigurationBuilder 配置源列表

添加 IConfigurationBuilder 扩展方法 AddCustom,将 CustomConfigurationSource 加入配置源集合中。

1

2

3

4

5

6

7

 

public static class CustomConfigurationExtensions

{

 public static IConfigurationBuilder AddCustom(this IConfigurationBuilder builder)

 {

 return builder.Add(new CustomConfigurationSource());

 }

}

 

启动入口添加 AddCustom

在 Program.cs 中的 ConfigureAppConfiguration 引用自定义配置源:

1

2

3

4

5

6

7

8

9

10

 

public static IHostBuilder CreateHostBuilder(string[] args) =>

 Host.CreateDefaultBuilder(args)

 .ConfigureWebHostDefaults(webBuilder =>

 {

  webBuilder.ConfigureAppConfiguration((context, configBuiler) =>

  {

  configBuiler.AddCustom();

  });

  webBuilder.UseStartup<Startup>();

 });

 

测试效果
再次查看 Configuration 对象的 Providers 属性,发现已包含 CustomConfigurationProvider:

ASP.NET Core如何自定义配置源示例详解

然后可通过 Configuration 对象获取对应 key 的内容:

1

2

3

4

5

 

[HttpGet]

public IEnumerable<string> Get()

{

 return new string[] { _configuration["name"], _configuration["company"] };

}

 

ASP.NET Core如何自定义配置源示例详解

总结

以上完成了一个简单的自定义配置源,实际情况会比这复杂些。如果关注过 JsonConfigurationProvider 的配置加载参数,有一个 reloadOnChange 参数用来设置当配置文件有变化时是否重新加载,如果 reloadOnChange 设置为 true,当配置文件变化时不需要重启服务就可以生效,很多时候我们是需要 Provider 具有这个功能的,在接下来介绍的 EtcdConfigurationProvider 中会实现,实现源码 已在 Github 可供参考。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。

相关热词:

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!

本文地址: https://v30.fanwenzhu.com/jiaob/net/9653.shtml

最新文章
 PS:这里需要注意 PS:这里需要注意

时间:2021-01-22

以为这个版本出来 以为这个版本出来

时间:2021-01-22

搜索winform designer 搜索winform designer

时间:2021-01-22

全新的membership框架Asp.ne 全新的membership框架Asp.ne

时间:2021-01-21

i dont know;18if (msg.Contains( i dont know;18if (msg.Contains(

时间:2021-01-21

统筹管理路由规则. 统筹管理路由规则.

时间:2021-01-21

根据switch-case语句来逐一判 根据switch-case语句来逐一判

时间:2021-01-21

EntityFramework 5.0 CodeFirst 教 EntityFramework 5.0 CodeFirst 教

时间:2021-01-21

Copyright © www.juheyunku.com      关于 | 合作 | 声明 | 联系 | 更新 | 地图 | Tags

ASP.NET Core如何自定义配置源示例详解

2020-12-27 编辑:网友投稿

正如大家所知,在 .NET Core 中配置文件改成了 appsettings.json,表面上和 .NET Framework 的 web.config 或 app.config 好像没有太大的区别,只是一种是 json ,一种是 xml,但其实 .NET Core 的配置体系是一种全新的设计,灵活且具扩展性。这里主要介绍一下在 .NET Core 的配置体系下如何扩展自定义配置源,配置源其实就是配置信息存放的载体,最常用的就是文件类型。

.NET Core 配置体系

在进行自定义配置源介绍前,我们需要先了解一下 .NET Core 中的配置体系。 .NET Core 的配置体系中主要包含 ConfigurationProvider、ConfigurationSource、ConfigurationBuilder、Configuration 几大核心对象。

ConfigurationProvider

实现 IConfigurationProvider 接口,配置源真正提供者,主要提供配置信息的加载与刷新。

ConfigurationSource

实现 IConfigurationSource 接口,提供对应的 ConfigurationProvider 具体实例。

ConfigurationBuilder

实现 IConfigurationBuilder 接口,负责将 ConfigurationSource 添加到配置源集合,再根据配置源集合构建出 ConfigurationRoot 对象,实现 IConfigurationRoot 接口。

Configuration

实现 IConfiguration 接口,Configuration 对象在逻辑上体现出树形化层次结构,配置信息均已键/值对的方式提供使用。

:*IConfigurationRoot 、IConfigurationSection 均继承于 IConfiguration,IConfigurationRoot 表示配置的根节点,IConfigurationSection 则表示配置的非根节点*

所以他们之间的关系就是 ConfigurationProvider 实现配置提供,然后通过 ConfigurationSource 构造配置源实例,接着通过 ConfigurationBuilder 将配置源实例 ConfigurationSource 添加到配置源集合中并构造出 ConfigurationRoot,最终以 Configuration 对象提供给程序使用。

ASP.NET Core如何自定义配置源示例详解

默认情况下,Configuration 对象的 Providers 属性包含如下 Provider:

ASP.NET Core如何自定义配置源示例详解

ChainedConfigurationProvider:应用程序本身相关配置信息,如:applicationName、contentRoot;

JsonConfigurationProvider:appsettings.json 和 appsettings.Development.json 中的配置信息;

EnvironmentVariablesConfigurationProvider:环境变量的配置信息;

CommandLineConfigurationProvider:命令行输入的配置信息;

这些类型的 Provider 在 .NET Core Web 项目中默认会自动加载,不需要手动配置,当然预置的 Provider 并不止这几种。

自定义配置源

前面提到 .NET Core 的配置体系是具有扩展性的,所以我们可以实现自定义的配置源,比如基于配置中心(如:etcd、apollo、consul 等)的实现,下面将模拟从配置中心获取,先了解整体实现方式,后面也会介绍我们在实际项目中基于 etcd 的实现方案。

创建 ConfigurationProvider

自定义 Provider 需要继承 ConfigurationProvider,然后重写 Load 方法,设置 Data 属性。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

 

public class CustomConfigurationProvider : ConfigurationProvider

{

 public override void Load()

 {

 // 模拟从远程配置中心获取配置信息

 using var httpClient = new HttpClient

 {

 BaseAddress = new Uri(":5000")

 };

 

 var response = httpClient.GetStringAsync("/api/configs")

 .ConfigureAwait(false)

 .GetAwaiter()

 .GetResult();

 

 if (!string.IsNullOrEmpty(response))

 {

 Data = JsonConvert.DeserializeObject<Dictionary<string, string>>(response);

 }

 }

}

 

:5000/api/configs 接口返回的 json 字符串,如下:

1

 

{"name":"beck","company":"mingdao"}

 

创建 ConfigurationSource

实现 IConfigurationSource 接口,在 Build 方法中返回 CustomConfigurationProvider 实例。

1

2

3

4

5

6

7

 

public class CustomConfigurationSource : IConfigurationSource

{

 public IConfigurationProvider Build(IConfigurationBuilder builder)

 {

 return new CustomConfigurationProvider();

 }

}

 

加入 ConfigurationBuilder 配置源列表

添加 IConfigurationBuilder 扩展方法 AddCustom,将 CustomConfigurationSource 加入配置源集合中。

1

2

3

4

5

6

7

 

public static class CustomConfigurationExtensions

{

 public static IConfigurationBuilder AddCustom(this IConfigurationBuilder builder)

 {

 return builder.Add(new CustomConfigurationSource());

 }

}

 

启动入口添加 AddCustom

在 Program.cs 中的 ConfigureAppConfiguration 引用自定义配置源:

1

2

3

4

5

6

7

8

9

10

 

public static IHostBuilder CreateHostBuilder(string[] args) =>

 Host.CreateDefaultBuilder(args)

 .ConfigureWebHostDefaults(webBuilder =>

 {

  webBuilder.ConfigureAppConfiguration((context, configBuiler) =>

  {

  configBuiler.AddCustom();

  });

  webBuilder.UseStartup<Startup>();

 });

 

测试效果
再次查看 Configuration 对象的 Providers 属性,发现已包含 CustomConfigurationProvider:

ASP.NET Core如何自定义配置源示例详解

然后可通过 Configuration 对象获取对应 key 的内容:

1

2

3

4

5

 

[HttpGet]

public IEnumerable<string> Get()

{

 return new string[] { _configuration["name"], _configuration["company"] };

}

 

ASP.NET Core如何自定义配置源示例详解

总结

以上完成了一个简单的自定义配置源,实际情况会比这复杂些。如果关注过 JsonConfigurationProvider 的配置加载参数,有一个 reloadOnChange 参数用来设置当配置文件有变化时是否重新加载,如果 reloadOnChange 设置为 true,当配置文件变化时不需要重启服务就可以生效,很多时候我们是需要 Provider 具有这个功能的,在接下来介绍的 EtcdConfigurationProvider 中会实现,实现源码 已在 Github 可供参考。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对服务器之家的支持。

本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供学习参考!
本文地址为 https://v30.fanwenzhu.com/jiaob/net/9653.shtml

相关文章

风云图片

推荐阅读

返回ASP.NET频道首页