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/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/HelloApi

课程链接

.NET云原生架构师训练营讲什么,怎么讲,讲多久

欢迎各位读者加入微信群一起学习交流,

在公众号后台回复“加群”即可~~

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

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

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第180篇原创文章 ...

  2. .NET 云原生架构师训练营(模块二 基础巩固 日志)--学习笔记

    2.2.2 核心模块--日志 ILogger 的使用 日志的 ID 日志的分类 日志的级别 LoggerProvider 日志的最佳实践 .NET Core 和 ASP.NET Core 中的日志记录 ...

  3. .NET 云原生架构师训练营(模块二 基础巩固 依赖注入)--学习笔记

    2.2.1 核心模块--依赖注入 什么是依赖注入 .NET Core DI 生命周期 服务设计 服务范围检查 ASP.NET Core 依赖注入:https://docs.microsoft.com/ ...

  4. .NET 云原生架构师训练营(模块二 基础巩固 安全)--学习笔记

    2.8 安全 认证 VS 授权 ASP .NET Core 认证授权中间件 认证 JWT 认证 授权 认证 VS 授权 认证是一个识别用户是谁的过程 授权是一个决定用户可以干什么的过程 401 Una ...

  5. .NET 云原生架构师训练营(模块二 基础巩固 REST RESTful)--学习笔记

    2.3.1 Web API -- REST && RESTful 什么是 REST,什么是 RESTful RESTful API 设计 RESTful 成熟度模型 什么是 REST, ...

  6. .NET 云原生架构师训练营(模块二 基础巩固 引入)--学习笔记

    2.1 引入 http协议 web server && web application framework .net 与 .net core asp .net core web api ...

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

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第176篇原创文章 ...

  8. ef 多个左联接查询_.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记...

    2.4.5 EF Core -- 查询 关联数据加载 客户端与服务端运算 跟踪与不跟踪 复杂查询运算 原生 SQL 查询 全局查询筛选器 关联数据加载 学员和助教都在项目分组中,调整模型,删除 Ass ...

  9. .NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记

    2.4.5 EF Core -- 查询 关联数据加载 客户端与服务端运算 跟踪与不跟踪 复杂查询运算 原生 SQL 查询 全局查询筛选器 关联数据加载 学员和助教都在项目分组中,调整模型,删除 Ass ...

最新文章

  1. Arm Cortex-M3 MCU性能
  2. 你知道Spring Boot项目是怎么启动的吗?
  3. JD 负载均衡中的 https
  4. Eclipse打包出错——提示GC overhead limit exceeded
  5. Codeforces Round #344 (Div. 2) B. Print Check
  6. springcloud-gateway启动报错ApplicationContextException: Unable to start ServletWebServerApplicationConte
  7. Lua require搜索路径指定方法
  8. 各国选手Techfest备战FMB世界杯,极战远征军斩获佳绩为国争光
  9. js面向对象的程序设计 --- 下篇 继承启蒙
  10. android 层叠轮播,vue手写一个卡片化层叠轮播(支持滑动,移动端连续滚动,点击)...
  11. linux系统删除openjdk并安装oracle jdk
  12. 190503每日一句
  13. java unicode 藏文_藏文各个字母对应的unicode编码和十进制
  14. IPEmotion采集J1939协议信号介绍
  15. 云计算如何从计算机发展而来,云计算是由什么发展而成的产物?
  16. 广告词 android,广告语猜猜看
  17. better-scroll的使用以及常见的api总结
  18. 已知a和b的最大公因数和最小公倍数求这两个数字
  19. 7-3 电话聊天狂人 (25 分)
  20. TDH sql及plsql的调优

热门文章

  1. java - 匿名类
  2. (备忘)打开office2010总是在配置进度
  3. Greenplum使用简明手册
  4. SQLServer2008-镜像数据库实施手册(双机)SQL-Server2014同样适用
  5. Could not load the Tomcat server configuration at \Servers\Tomcat v7.0 Server at localhost-config
  6. Unity3D4.* NGUI制作动态字库
  7. 心得9--jsp设计模版
  8. 罗斯文2007(Northwind 2007)数据库、Access 2007 样列数据库分析[转]
  9. Mac OS X 10.10更新及体验
  10. android wi-fi_如何在Android手机上查找3G或Wi-Fi速度