特别说明:
1、本系列内容主要基于杨中科老师的书籍《ASP.NET Core技术内幕与项目实战》及配套的B站视频视频教程,同时会增加极少部分的小知识点
2、本系列教程主要目的是提炼知识点,追求快准狠,以求快速复习,如果说书籍学习的效率是视频的2倍,那么“简读系列”应该做到再快3-5倍

本节内容,涉及3.2(P60-P69),7.2(P188-P193),NuGet包

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Json
  • Microsoft.Extensions.Configuration.CommandLine
  • Microsoft.Extensions.Configuration.EnvironmentVariables
  • Microsoft.Extensions.Configuration.Binder
  • Microsoft.Extensions.Options
  • ...

一、直接读取配置

 1 //appsetting.json文件,需设置为“如果较新则复制”
2 {
3 "name": "functionMC",
4 "proxy": {
5 "address": "192.1.1.1",
6 "port": 1088
7 }
8 }
9
10
11 //Program.cs
12 ConfigurationBuilder configBuilder = new ConfigurationBuilder();
13 configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange:false);
14 IConfigurationRoot config = configBuilder.Build();
15
16 string name = config["proxy:address"];
17 Console.WriteLine(name);
18
19 string proxyAddress = config.GetSection("name").Value;
20 Console.WriteLine(proxyAddress);

代码解释:

12-13行:构建ConfigurationBuild对象,并调用该对象的AddJsonFile方法,加载Json配置文件

14行:调用ConfigurationBuild对象的Build方法,构建IConfigurationRoot对象-config,用于读取配置

16行:通过config["key"]方式,读取key值,读取联级key的方式,与config.GetSection一致,"proxy:address"

19行:通过config.GetSection方法,读取key值

补充说明:

①涉及类型: ConfigurationBuild(配置)、IConfigurationRoot(读取)-体现面向接口编程,根据不同的配置源有不同的实现

②13行可以设置其它配置源:

  • 从命令行读取:configBuild.AddCommandLine(args);
  • 从环境变量读取:configBuild.AddEnvironmentVariables("Test_"),其中Test_为环境变量的前缀,可以实现过滤
  • 其它配置源:INI文件、XML文件、Key-per-file文件、用户机密、第三方配置提供程序等
  • 当在13行,配置多个数据源时,按Add的添加顺序读取,如果多个配置源设置了相同的key,则后面的key值覆盖前面的key值
  • 在ASP.NET Core,已经默认添加了多个配置源,添加顺序为appsettings.json < appsettings.[运行时环境变量].json< 用户机密 < 环境变量 < 命令行

③在VS上设置命令行参数和环境变量的入口,项目右击>属性>调试>打开调试启动配置文件UI。用户机密入口,项目右击>管理用户机密

二、通过选项方式读取

 1 //appsettings.json文件
2 {
3 "Smtp": {
4 "Server": "smtp.youzack.com",
5 "UserName": "functionMC",
6 "Password": "hello123"
7 },
8 "Db": {
9 "DbType": "SQLServer",
10 "ConnectionString": "Data..."
11 }
12 }
13
14
15 //两个与配置Smtp和Db关联的类
16 //SmtpSettings.cs
17 class SmtpSettings
18 {
19 public string Server { get; set; }
20 public string UserName { get; set; }
21 public string Password { get; set; }
22 }
23
24 //DbSettings.cs
25 class DbSettings
26 {
27 public string DbType { get; set; }
28 public string ConnectionString { get; set; }
29 }
30
31
32 //配置、选项绑定,并调用一个方法来读取配置
33 //Program.cs
34 ConfigurationBuilder configBuilder = new ConfigurationBuilder();
35 configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange:true);
36 IConfigurationRoot config = configBuilder.Build();
37
38 ServiceCollection services = new ServiceCollection();
39 services.AddOptions()
40 .Configure<DbSettings>(e=>config.GetSection("Db").Bind(e))
41 .Configure<SmtpSettings>(e=>config.GetSection("Smtp").Bind(e));
42
43 services.AddTransient<ReadOptions>();
44
45 using (var sp = services.BuildServiceProvider())
46 {
47 while (true)
48 {
49 using (var scope = sp.CreateScope())
50 {
51 var sp_scope = scope.ServiceProvider;
52 var readOptions = sp_scope.GetRequiredService<ReadOptions>();
53 readOptions.Read();
54 }
55 Console.WriteLine("修改appsettings后,按任意键读取最新的配置");
56 Console.ReadKey();
57 }
58 }
59
60
61 //读取配置的方法类
62 //ReadOptions.cs
63 class ReadOptions
64 {
65 private readonly IOptionsSnapshot<SmtpSettings> optSmtpSettings;
66 private readonly IOptionsSnapshot<DbSettings> optDbSettings;
67
68 public ReadOptions(IOptionsSnapshot<SmtpSettings> optSmtpSettings, IOptionsSnapshot<DbSettings> optDbSettings)
69 {
70 this.optSmtpSettings = optSmtpSettings;
71 this.optDbSettings = optDbSettings;
72 }
73
74 public void Read()
75 {
76 var smtp = optSmtpSettings.Value;
77 var db = optDbSettings.Value;
78 Console.WriteLine(smtp.UserName);
79 Console.WriteLine(db.DbType);
80 }
81 }

代码解释:

17-29行:定义两个类(选项类),分别映身appsettings的两个属性。SmtpSettings.cs映射Smtp属性,DbSettings.cs映射Db属性,名字一一对应

38行:构建依赖注入的容器

39-41行:注册选项服务AddOptions,并设置“选项类和配置文件属性”之间的映射关系。这样写也可以:services.AddOption;services.Configure<DbSettings>......

43行:将读取配置的类注册为瞬时服务(ReadOptions),这样在后面循环读取配置时,每次都能创建一个新的服务

45-58行:通过服务定位器的方式获取服务(ReadOptions对象),使用了子域方式,稍显复杂,主要目的是测试修改appsettings时的实时更新

63-81行:以依赖注入的方式,注入读取配置的服务,注意不能直接使用SmtpSettings或DbSettings,需要使用IOptions<T>泛型接口

补充说明:

①读取配置的泛型接口,有三种:IOptions<T>(类似单例),IOptionsMonitor<T>(类似范围),IOptionsSnapshot<T>(类似瞬时)。以上案例,改成另外两个,都无法实现配置信息的实时更新。其中IOptions<T>,需要重启应用;IOptionsMonitor<T>,重启应用,或者修改代码,不在Scope中读取

三、在ASP.NET Core中设置和读取配置(本节有补充知识点)

 1 //appsettings.json文件
2 {
3 "Smtp": {
4 "Server": "192.1.1.1",
5 "UserName": "functionMC",
6 "Password": "123456"
7 }
8 }
9
10
11 //选项类SmtpSettings.cs
12 public class SmtpSettings
13 {
14 public string Server { get; set; }
15 public string UserName { get; set; }
16 public string Password { get; set; }
17 }
18
19
20 //使用MiniApi方式,直接在Program中设置选项绑定和读取配置
21 var builder = WebApplication.CreateBuilder(args);
22 builder.Services.Configure<SmtpSettings>(builder.Configuration.GetSection("Smtp"));
23
24 var app = builder.Build();
25
26 app.MapGet("/", (IConfiguration config,IOptions<SmtpSettings> smtpOptions) =>
27 {
28 return $"直接读取:{config["Smtp:UserName"]},选项读取:{smtpOptions.Value.UserName}";
29 });
30
31 app.Run();

代码解释:

21行:CreateBuilder完成一系列框架设置,包括配置体系(AddJsonFile,AddOptions等),所以不需要手动设置配置体系,框架自动设置多配置源

22行:绑定选项类和配置属性。在Program中不方便注入,通过调用build的属性Configuration,返回IConfiguration接口读取配置(区别于.NET中的IConfigurationRoot)

26行:通过MiniApi的参数注入两个服务,IConfigurations和IOptions<T>,均由框架自动注册。如果使用控制器,可通过构造函数方式注入

28行:使用两种方式读取配置:直接读取配置、通过选项方式读取配置

简读《ASP.NET Core技术内幕与项目实战》之3:配置的更多相关文章

  1. 快读《ASP.NET Core技术内幕与项目实战》EFCore2.5:集合查询原理揭秘(IQueryable和IEnumerable)

    本节内容,涉及4.6(P116-P130).主要NuGet包:如前述章节 一.LINQ和EFCore的集合查询扩展方法的区别 1.LINQ和EFCore中的集合查询扩展方法,虽然命名和使用完全一样,都 ...

  2. 快读《ASP.NET Core技术内幕与项目实战》WebApi3.1:WebApi最佳实践

    本节内容,涉及到6.1-6.6(P155-182),以WebApi说明为主.主要NuGet包:无 一.创建WebApi的最佳实践,综合了RPC和Restful两种风格的特点 1 //定义Person类 ...

  3. 《ASP.NET Core技术内幕与项目实战》精简集-目录

    本系列是杨中科2022年最新作品<ASP.NET Core技术内幕与项目实战>及B站配套视频(强插点赞)的精简集,是一个读书笔记.总结和提炼了主要知识点,遵守代码优先原则,以利于快速复习和 ...

  4. ASP.NET Core 2.0 MVC项目实战

    一.前言 毕业后入职现在的公司快有一个月了,公司主要的产品用的是C/S架构,再加上自己现在还在学习维护很老的delphi项目,还是有很多不情愿的.之前实习时主要是做.NET的B/S架构的项目,主要还是 ...

  5. 手写一个简版 asp.net core

    手写一个简版 asp.net core Intro 之前看到过蒋金楠老师的一篇 200 行代码带你了解 asp.net core 框架,最近参考蒋老师和 Edison 的文章和代码,结合自己对 asp ...

  6. 极简版ASP.NET Core学习路径及教程

    绝承认这是一个七天速成教程,即使有这个效果,我也不愿意接受这个名字.嗯. 这个路径分为两块: 实践入门 理论延伸 有了ASP.NET以及C#的知识以及项目经验,我们几乎可以不再需要了解任何新的知识就开 ...

  7. ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍

    在上一章中,我们介绍了 ASP.NET Core 的启动过程,主要是对 WebHost 源码的探索.而本文则是对上文的一个补充,更加偏向于实战,详细的介绍一下我们在实际开发中需要对 Hosting 做 ...

  8. ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package

    目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我 ...

  9. ASP.NET Core 2.0 : 三. 项目结构

    本章我们一起来对比着ASP.NET Framework版本看一下ASP.NET Core 2.0的项目结构.(此后的文章也尽量这样对比着, 方便学习理解.) 关注差异, 也为项目迁移做准备. 新建项目 ...

随机推荐

  1. 蔚来杯2022牛客暑期多校训练营7 CFGJ

    比赛链接 C 题解 方法一 知识点:思维. 先统计没有出现的数,每个都可以随便放,所以作为补位用的. 将原数组左移一位作为预定的答案数组,然后开始检查.如果和原数组一样,则用补位数字填充,如果不一样就 ...

  2. BZOJ1977/LuoguP4180【模板】严格次小生成树[BJWC2010] (次小生成树)

    这道题本身思维难度不大,但综合性强,细节多 在其上浪一个早上,你的 最小生成树 树链剖分 线段树 DEBUG能力... 都大幅提升 细节与思路都在代码里面了. 欢迎hack. #include< ...

  3. ArkUI 组件 Props

    在上一篇博客文章中简单地提到了 Props . 在使用 Props 时需要注意到一个点,子组件从寄主页面传递过来的值是单向的,也就是子组件不能直接修改传递下来的值,即单向性. 以上篇文章定义的头像组件 ...

  4. Excelize 2.3.1 发布,Go 语言 Excel 文档基础库,支持加密表格文档

    Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...

  5. 逻辑判断与if and while循环结构

    逻辑判断与if and while循环结构 逻辑判断 逻辑运算符在进行逻辑判断时遇到打印输出命令时 and 当碰到一个条件为False时那么整个条件即为False,当碰到第一个为True时如果之后的值 ...

  6. DLL Proxy Loading Bypass AV

    DLL Proxy Loading Bypass AV 前言 感谢国外大佬开源的免杀思路,本文就是基于该文章的一次实践. https://redteaming.co.uk/2020/07/12/dll ...

  7. windows下Inno Setup打包

    基于inno setup的windos打包,主要脚本语言inno script.下载地址:https://jrsoftware.org/isdl.php相关打包教程:https://blog.csdn ...

  8. 流媒体协议扫盲(rtp/rtcp/rtsp/rtmp/mms/hls)

    RTP           参考文档 RFC3550/RFC3551 Real-time Transport Protocol)是用于Internet上针对多媒体数据流的一种传输层协议.RTP协议详细 ...

  9. clipboard实现文本复制的方法

    1.下载地址: https://github.com/mo3408/clipboard 2.使用方法: 先引入js: <script src="dist/clipboard.min.j ...

  10. JAVA中自定义扩展Swagger的能力,自动生成参数取值含义说明,提升开发效率

    大家好,又见面了. 在JAVA做前后端分离的项目开发的时候,服务端需要提供接口文档供周边人员做接口的对接指导.越来越多的项目都在尝试使用一些基于代码自动生成接口文档的工具来替代由开发人员手动编写接口文 ...