简读《ASP.NET Core技术内幕与项目实战》之3:配置
特别说明:
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:配置的更多相关文章
- 快读《ASP.NET Core技术内幕与项目实战》EFCore2.5:集合查询原理揭秘(IQueryable和IEnumerable)
本节内容,涉及4.6(P116-P130).主要NuGet包:如前述章节 一.LINQ和EFCore的集合查询扩展方法的区别 1.LINQ和EFCore中的集合查询扩展方法,虽然命名和使用完全一样,都 ...
- 快读《ASP.NET Core技术内幕与项目实战》WebApi3.1:WebApi最佳实践
本节内容,涉及到6.1-6.6(P155-182),以WebApi说明为主.主要NuGet包:无 一.创建WebApi的最佳实践,综合了RPC和Restful两种风格的特点 1 //定义Person类 ...
- 《ASP.NET Core技术内幕与项目实战》精简集-目录
本系列是杨中科2022年最新作品<ASP.NET Core技术内幕与项目实战>及B站配套视频(强插点赞)的精简集,是一个读书笔记.总结和提炼了主要知识点,遵守代码优先原则,以利于快速复习和 ...
- ASP.NET Core 2.0 MVC项目实战
一.前言 毕业后入职现在的公司快有一个月了,公司主要的产品用的是C/S架构,再加上自己现在还在学习维护很老的delphi项目,还是有很多不情愿的.之前实习时主要是做.NET的B/S架构的项目,主要还是 ...
- 手写一个简版 asp.net core
手写一个简版 asp.net core Intro 之前看到过蒋金楠老师的一篇 200 行代码带你了解 asp.net core 框架,最近参考蒋老师和 Edison 的文章和代码,结合自己对 asp ...
- 极简版ASP.NET Core学习路径及教程
绝承认这是一个七天速成教程,即使有这个效果,我也不愿意接受这个名字.嗯. 这个路径分为两块: 实践入门 理论延伸 有了ASP.NET以及C#的知识以及项目经验,我们几乎可以不再需要了解任何新的知识就开 ...
- ASP.NET Core 运行原理解剖[2]:Hosting补充之配置介绍
在上一章中,我们介绍了 ASP.NET Core 的启动过程,主要是对 WebHost 源码的探索.而本文则是对上文的一个补充,更加偏向于实战,详细的介绍一下我们在实际开发中需要对 Hosting 做 ...
- 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想试试,我 ...
- ASP.NET Core 2.0 : 三. 项目结构
本章我们一起来对比着ASP.NET Framework版本看一下ASP.NET Core 2.0的项目结构.(此后的文章也尽量这样对比着, 方便学习理解.) 关注差异, 也为项目迁移做准备. 新建项目 ...
随机推荐
- java-servlet-EL表达式和java标签
1 Servlet线程安全问题 1st. 为什么说servlet会有线程安全问题? 容器默认情况下,对于某个servlet,只会创建一个实例. 容器收到一个请求,就 ...
- 编写X86的ShellCode
ShellCode 定义 ShellCode是不依赖环境,放到任何地方都能够执行的机器码 编写ShellCode的方式有两种,分别是用编程语言编写或者用ShellCode生成器自动生成 ShellCo ...
- 记录一次数据库CPU被打满的排查过程
1 前言 近期随着数据量的增长,数据库CPU使用率100%报警频繁起来.第一个想到的就是慢Sql,我们对未合理运用索引的表加入索引后,问题依然没有得到解决,深入排查时,发现在 order by id ...
- Java自增自减运算
自增自减运算 //++(自增) --(自减) 一元允运算 int a =3; //a = a+1-----4 int b=a++; //执行完这行代码后,先给b赋值,再自增 System.out.pr ...
- 如何做raid级别磁盘(rhel和centos系统皆可)
添加磁盘,自己需要多少磁盘即可添加多少数量 此处只添加了三块200MB大小的磁盘 此处三块磁盘,只有两块做raid,一块与raid磁盘为实验测读写速率,不测速率可三块都做raid. 进入虚拟机给三个磁 ...
- Kingbase_FDW 使用介绍
与postgresql_fdw功能类似,KINGBASE_FDW 是一种外部访问接口,它可以被用来访问存储在外部的数据.想要使用fdw访问数据需要先确保:网络通,数据库访问配置(pg_hba,con ...
- 坚守自主创新,璞华HawkEye IETM系统惠及国计民生
可上九天揽月,可下五洋捉鳖,这是我们很多年的梦想.而要实现这样的梦想,不仅需要安全可靠的技术装备,还需要让这些技术装备处于良好的维保状态.于是,作为装备维保过程中必须的知识创作.管理.发布.浏览工具, ...
- 【HMS Core】集成地图服务不显示地图问题
[问题描述] 关于华为HMS-地图服务不显示地图的问题. 背景:集成华为地图服务运行后页面不显示地图,运行app后不展示地图报错MapsInitializer is not initialized. ...
- js工厂模式和构造函数
<!DOCTYPE html><html><head> <title>工厂模式和构造函数</title> <meta charset ...
- P1829 [国家集训队]Crash的数字表格
P1829 [国家集训队]Crash的数字表格 原题传送门 前置芝士 莫比乌斯反演 乘法逆元 数论分块 正文 //补充:以下式子中的除法均为整除 由题目可以得知,这道题让我们所求的数,用一个式子来表达 ...