2.2.3 核心模块--配置

  • IConfiguration
  • Options

ASP.NET Core 中的配置:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0

IConfiguration

  • IConfiguration 的使用
  • 层级对象配置到 key-value 键值对转换
  • 通过环境变量修改日志级别
  • 通过命令行修改日志级别

IConfiguration 的使用

appsettings.json

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

新增 ConfigController.cs

namespace HelloApi.Controllers
{
[ApiController]
[Route("[controller]")]
public class ConfigController : Controller
{
private readonly IConfiguration _configuration; public ConfigController(IConfiguration configuration)
{
_configuration = configuration;
} [HttpGet]
public IActionResult GetConfigurations()
{
var result = new List<string>(); foreach (var key in _configuration.AsEnumerable())
{
result.Add($"Key: {key.Key}, value: {key.Value}");
} return Ok(result);
}
}
}

启动程序,访问:https://localhost:5001/config

不仅得到 appsettings.json 的配置, 还可以得到环境变量配置

可以在 ConfigureAppConfiguration 中清除所有配置,再添加自己需要的配置,后面添加的配置会覆盖前面的配置

.ConfigureAppConfiguration((hostingContext, config) =>
{
config.Sources.Clear(); var env = hostingContext.HostingEnvironment; config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);
})

启动程序,访问:https://localhost:5001/config

这样可以得到自己添加的配置

层级对象配置到 key-value 键值对转换

appsettings.json

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

通过冒号读取下一级配置(Windows),Linux 上通过下划线

[HttpGet]
public IActionResult GetConfigurations()
{
var result = new List<string>(); //foreach (var key in _configuration.AsEnumerable())
//{
// result.Add($"Key: {key.Key}, value: {key.Value}");
//} return Content(string.Format("Default Log Level: {0}", _configuration["Logging:LogLevel:Default"]));
}

启动程序,输出如下:

Default Log Level: Debug

通过环境变量修改日志级别

在 launcSettings.json 中添加 Trace 日志级别

"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development",
"Logging__LogLevel__Default": "Trace"
}

在 CreateHostBuilder 的时候添加环境变量配置

config.AddEnvironmentVariables();

启动程序,输出如下:

Default Log Level: Trace

通过命令行修改日志级别

CreateHostBuilder

config.AddCommandLine(source =>
{
source.Args = args;
});

在命令行中设置

set Logging__LogLevel__Default=Warning

Options

  • 通过 ConfigurationBinder 操作 Options
  • 通过 Configure 绑定 Option

通过 ConfigurationBinder 操作 Options

新建 MyOption.cs

namespace HelloApi
{
public class MyOption
{
public string Name { get; set; } public int Age { get; set; }
}
}

在 appsettings.json 中新增一个节点

"MyOption": {
"Name": "Mingson",
"Age": 25
},

在 ConfigureServices 中绑定

var myOption = new MyOption();
Configuration.GetSection("MyOption").Bind(myOption);
// 单例注入到全局中
services.AddSingleton(myOption);

在 ConfigController 中注入,与获取

private readonly MyOption _myOption;

public ConfigController(IConfiguration configuration, MyOption myOption)
{
_configuration = configuration;
_myOption = myOption;
} [HttpGet("option")]
public IActionResult GetOption()
{
return Ok(_myOption);
}

启动程序,访问:https://localhost:5001/config/option

输出如下:

{"name":"Mingson","age":25}

通过 Get 的方式

myOption = Configuration.GetSection("MyOption").Get<MyOption>();

通过 Configure 绑定 Option

IOptions

  • IOptions 被注册为 singletone,不支持为可命名的配置
  • IOptionsSnapshot 被注册为 scoped,支持为可命名的配置
  • IOptionsMonitor 被注册为 singletone,会被通知,支持重载配置,支持为可命名的配置

IOptions

// 直接注入到容器中
services.Configure<MyOption>(Configuration.GetSection("MyOption"));

通过 IOptions 注入

public ConfigController(IConfiguration configuration, IOptions<MyOption> myOption)
{
_configuration = configuration;
_myOption = myOption.Value;
}

启动程序可以得到同样的输出

IOptionsSnapshot

public ConfigController(IConfiguration configuration, IOptionsSnapshot<MyOption> myOption)
{
_configuration = configuration;
_myOption = myOption.Value;
}

启动程序,修改配置,刷新浏览器,可以获取到修改后的配置

可命名的配置

appsettings.json

"Jack": {
"Name": "Jack",
"Age": 16
},
"Peter": {
"Name": "Peter",
"Age": 18
}

MyOption.cs

public const string PETER = "Peter";

public const string JACK = "Jack";

ConfigureServices

services.Configure<MyOption>("Peter", Configuration.GetSection("Peter"));
services.Configure<MyOption>("Jack", Configuration.GetSection("Jack"));

ConfigController

_myOption = myOption.Get(MyOption.PETER);
_myOption = myOption.Get(MyOption.JACK);

启动程序即可读取不同命名的配置

IOptionsMonitor

public ConfigController(IConfiguration configuration, IOptionsMonitor<MyOption> myOption)
{
_configuration = configuration;
_myOption = myOption.CurrentValue; // 配置变化处理
myOption.OnChange(option =>
{ });
}

option 验证

属性验证标签

namespace HelloApi
{
public class MyConfigOptions
{
public const string MyConfig = "MyConfig"; [RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$")]
public string Key1 { get; set; } [Range(0, 1000, ErrorMessage = "Value for {0} must be between {1} and {2}.")]
public int Key2 { get; set; } public int Key3 { get; set; }
}
}

绑定后校验

ConfigureServices

services.AddOptions<MyOption>().Bind(Configuration.GetSection("MyOption")).ValidateDataAnnotations();

MyOption

[Range(1, 20)]
public int Age { get; set; }

启动程序,输出如下:

OptionsValidationException: DataAnnotation validation failed for members: 'Age' with the error: 'The field Age must be between 1 and 20.'.

PostConfigure

当配置被读取出来的时候会被执行

services.PostConfigure<MyOption>(option =>
{
if (option.Age == 20)
{
option.Age = 19;
}
});

GitHub源码链接:

https://github.com/MingsonZheng/ArchitectTrainingCamp/tree/main/HelloApi

课程链接

https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

.NET 云原生架构师训练营(模块二 基础巩固 配置)--学习笔记的更多相关文章

  1. .NET 云原生架构师训练营(建立系统观)--学习笔记

    目录 目标 ASP .NET Core 什么是系统 什么是系统思维 系统分解 什么是复杂系统 作业 目标 通过整体定义去认识系统 通过分解去简化对系统的认识 ASP .NET Core ASP .NE ...

  2. .NET 云原生架构师训练营(对象过程建模)--学习笔记

    目录 UML OPM OPM优化 UML 1997年发布UML标准 主要域 视图 图 主要概念 结构 静态视图 类图 类.关联.泛化.依赖关系.实现.接口 用例视图 用例图 用例.参与者.关联.扩展. ...

  3. .NET 云原生架构师训练营(设计原则&&设计模式)--学习笔记

    目录 设计原则 设计模式 设计原则 DRY (Don't repeat yourself 不要重复) KISS (Keep it stupid simple 简单到傻子都能看懂) YAGNI (You ...

  4. .NET 云原生架构师训练营(责任链模式)--学习笔记

    目录 责任链模式 源码 责任链模式 职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无需关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了 何时使用:在处理 ...

  5. .NET 云原生架构师训练营(模块一 架构师与云原生)--学习笔记

    目录 什么是软件架构 软件架构的基本思路 单体向分布式演进.云原生.技术中台 1.1 什么是软件架构 1.1.1 什么是架构? Software architecture = {Elements, F ...

  6. .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记

    目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...

  7. .NET 云原生架构师训练营(模块二 基础巩固 敏捷开发)--学习笔记

    2.7.1 敏捷开发 敏捷介绍 敏捷的起源 敏捷软件开发宣言 敏捷开发十二原则 生命周期对比 敏捷开发的特点 敏捷的发展 敏捷的核心 敏捷的起源 2001年,17个老头子在一起一边滑雪,一边讨论工作, ...

  8. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 介绍和基础)--学习笔记

    2.5.1 MongoDB -- 介绍 mysql vs mongo 快速开始 mysql vs mongo 对比 mysql mongo 数据存储 table 二维表结构,需要预先定义结构 json ...

  9. .NET 云原生架构师训练营(模块二 基础巩固 MongoDB 问答系统)--学习笔记

    2.5.6 MongoDB -- 问答系统 MongoDB 数据库设计 API 实现概述 MongoDB 数据库设计 设计优化 内嵌(mongo)还是引用(mysql) 数据一致性 范式:将数据分散到 ...

  10. .NET 云原生架构师训练营(模块二 基础巩固 Scrum 团队)--学习笔记

    2.7.3 Scrum 团队 理想的环境 团队章程 如何组建 Scrum 团队 产品待办事项列表 用户故事 敏捷开发流程 理想的环境 5-9人 100% 跨职能 在一起 自组织 自组织 目标 授权 沟 ...

随机推荐

  1. S3C2440移植uboot之新建单板_时钟_SDRAM_串口

    上一节S3C2440移植uboot之启动过程概述我们我们分析了uboot启动流程,这节将开始新建一块单板支持S3C2440. 目录 1.新建单板 1.1 将2410的单板文件夹拷贝成2440: 1.2 ...

  2. 我发现明显产品bug啦

    1.  百度云在下载时,如果选中的文件过多,在点击下载后,不能即时取消所有的下载项! 如下图,点击""全部取消" 出现在列表中项全部消失,但后续新的项继续出现,仍在下载, ...

  3. C# 防XSS攻击 示例

    思路: 对程序代码进行过滤非法的关键字 新建控制台程序,编写代码测试过滤效果 class Program { static void Main(string[] args) { //GetStrReg ...

  4. LightOJ 1094

    题意:就是求一个树的直径,也就是求任意两点的最大距离. 做法:跑两遍DFS,详见代码. #include<iostream> #include<cstdio> #include ...

  5. 解决 idea maven plugins 报红波浪线

    导入新项目到 idea 的时候,由于依赖的环境以及项目中 maven 编译所依赖的pom的版本不同,很多时候导入到idea的时候 maven Plugins 会出现报红的情况,这是由于maven仓库中 ...

  6. Cortex M3 - NVIC(中断向量控制器)

    NVIC-概述 nested vector interrupt control - 内嵌向量中断控制器 传统ARM中断控制在Core的外部,软件接收到中断之后,需要查中断的编号,然后启动相应的中断处理 ...

  7. 浏览器兼容 : IE10

    <script> /*@cc_on @*//*@ if (document.documentMode == 10) { // 只在 IE10 文档模式下运行,例如 IE10 浏览器或 IE ...

  8. 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.18)

    一.百度网盘SVIP超级会员共享账号 可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答. 我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免 ...

  9. Oracle数据类型的简单学习之一

    Oracle数据类型的简单学习之一 背景 因为信创安可替代的发展 有很多项目提到了数据库切换到国产数据库的要求. 一般情况是要求从Oracle/SQLServer 迁移到国产的: 达梦/瀚高/人大金仓 ...

  10. [转帖]Oracle性能优化-大内存页配置

    一.为什么需要大页面? 如果您有一个大的RAM和SGA,那么HugePages对于Linux上更快的Oracle数据库性能是至关重要的.如果您的组合数据库SGAs很大(比如超过8GB,甚至对于更小的数 ...