3.2 配置系统

简介: .Net Core配置系统支持文件(Json、XML、INI)、注册表、环境变量、命令行、AZure Key Vault等。

3.2 配置系统

配置系统基本使用

.Net Core配置系统支持文件(Json、XML、INI)、注册表、环境变量、命令行、AZure Key Vault等。

案例,使用jsonwen文件来配置。

新建config.json文件,程序默认加载exe同目录下的配置文件,所以应设置config.json“复制到输出目录”属性为“如果较新则复制”

{

 "name": "zack",

 "proxy": {

   "address": "192.168.1.9",

   "port": 1088

 }

}

.net core系统配置开发包为Microsoft.Extensions.Configuration,读取JSON文件应使用Microsoft.Extensions.Configuration.Json。

usingMicrosoft.Extensions.Configuration;

//配置创建器

ConfigurationBuilderconfigBuilder=newConfigurationBuilder();

//添加一个待解析的JSON文件,option,为true时文件不存在也不会报错;reloadOnChange:文件修改是否重新加载配置

configBuilder.AddJsonFile("config.json", optional: false, reloadOnChange: false);

//通过它读取配置项

IConfigurationRootconfig=configBuilder.Build();

stringname=config["name"];

stringproxyAddress=config.GetSection("proxy:address").Value;//配置分级方式的读取

选项方式读取配置

选项方式可以和依赖注入结合,同时可以实现修改配置后自动刷新。

需要安装Microsoft.Extensions.Options和Microsoft.Extensions.Binder。

案例:

  1. 新建appsettings.json文件

{

 "Logging": { "LogLevel": { "Default": "Warning" } },

 "DB": {

   "DbType": "SQLServer",

   "ConnectionString": "Data Source=.;Initial Catalog=DemoDB; Integrated Security=True"

 },

 "Smtp": {

   "Server": "smtp.youzack.com",

   "UserName": "zack",

   "Password": "hello888"

 },

 "AllowedHosts": "*"

}

  1. 我们只对DB和Smtp感兴趣,建立另个对应的模型类

publicclassDbSettings

{

   publicstringDbType { get; set; }

   publicstringConnectionString { get; set; }

}

publicclassSmtpSettings

{

   publicstringServer { get; set; }

   publicstringUserName { get; set; }

   publicstringPassword { get; set; }

}

使用选项方式读取配置时需要和依赖注入一起使用,所以创建一个类哟用于获取注入的选项值。接收选项注入的对象有:

IOptions<T>:配置改变后,不能读取新的值,必须重启程序

IOptionsMonitor<T>:配置改变后可以读取新的值,A、B两处都读取某个选项值,在A之后B之前配置项改变,A仍然是旧值,B是新值

IOptionsSnapshot<T>:和IOptionsMonitor<T>不同之处在于AB都是旧值,再次进入这个范围才会读到新值

  1. 测试读取Demo类

usingMicrosoft.Extensions.Options;

classDemo

{

   //在构造方法中声明所依赖的类

   privatereadonlyIOptionsSnapshot<DbSettings>optDbSettings;

   privatereadonlyIOptionsSnapshot<SmtpSettings>optSmtpSettings;

   publicDemo(IOptionsSnapshot<DbSettings>optDbSettings,

       IOptionsSnapshot<SmtpSettings>optSmtpSettings)

   {

       this.optDbSettings=optDbSettings;

       this.optSmtpSettings=optSmtpSettings;

   }

   publicvoidTest()

   {

       vardb=optDbSettings.Value;//通过value属性获取对象具体的值

       Console.WriteLine($"数据库:{db.DbType},{db.ConnectionString}");

       varsmtp=optSmtpSettings.Value;

       Console.WriteLine($"Smtp:{smtp.Server},{smtp.UserName},{smtp.Password}");

   }

}

  1. 注入服务到容器

usingMicrosoft.Extensions.Configuration;

usingMicrosoft.Extensions.DependencyInjection;

ConfigurationBuilderconfi   gBuilder=newConfigurationBuilder();

configBuilder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);//reloadOnChange要设置为true

IConfigurationRootconfig=configBuilder.Build();

ServiceCollectionservices=newServiceCollection();//容器

services.AddOptions()//注册与选项相关的服务

   .Configure<DbSettings>(e=>config.GetSection("DB").Bind(e))//将DB节点的内容绑定到DbSettings上

   .Configure<SmtpSettings>(e=>config.GetSection("Smtp").Bind(e));

//上面定义的IOptionsSnapshot<T>为范围,所以Demo不能是单例,因为Demo中需要Option,所以Demo不能比Option声明周期短

services.AddTransient<Demo>();

using (varsp=services.BuildServiceProvider())

{

   while (true)

   {

       using (varscope=sp.CreateScope())//option设置为范围声明周期,在这里,创建一个新范围

       {

           varspScope=scope.ServiceProvider;

           vardemo=spScope.GetRequiredService<Demo>();

           demo.Test();

       }

       Console.WriteLine("可以改配置啦");

       Console.ReadKey();

   }

}

从命令行读取配置

适合容器化的运行环境

//NuGet安装Microsoft.Exensions.Configuration.CommandLine

ConfigurationBuilderconfigBuilder=newConfigurationBuilder();

configBuilder.AddCommandLine(args);

IConfigurationRootconfig=configBuilder.Build();

stringserver=config["server"];

Console.WriteLine($"server:{server}");

从环境变量读取配置

//NuGet安装Microsoft.Exensions.Configuration.EnvironmentVariables

ConfigurationBuilderconfigBuilder=newConfigurationBuilder();

//AddEnvironmentVariables存在无参数和prefix参数两个版本

//无参数表示将所有环境变量加载,prefix表示将带有某前缀的环境便令读入

configBuilder.AddEnvironmentVariables("TEST_");

IConfigurationRootconfigRoot=configBuilder.Build();

stringname=configRoot["Name"];//环境变量TEST_Name

Console.WriteLine(name);

多配制源

场景:开发的软件可以从服务器中读取配置,但是我们想临时更改配置又不影响其他用户,并且日后不想用了可以直接删除本地配置即可。

ConfigurationBuilderconfigBuilder=newConfigurationBuilder();

//增加json、环境变量、命令行配置

//后添加的配置程序覆盖之前的配置程序

configBuilder.AddJsonFile("appsettings.json")

   .AddEnvironmentVariables("Test1_").AddCommandLine(args);

IConfigurationRootconfig=configBuilder.Build();

stringserver=config["Server"];

stringuserName=config["UserName"];

stringpassword=config["Password"];

stringport=config["Port"];

//Console.WriteLine($"server={server},port={port}");

//Console.WriteLine($"userName={userName},password={password}");

//配置源较多的时候,查看配置值来自哪个配置程序

Console.WriteLine(config.GetDebugView());

相关文章
|
9月前
|
存储 人工智能 大数据
系统和32位系统的区别
系统和32位系统的区别
|
存储 Shell Linux
Shell命令切换root用户、管理配置文件、检查硬件
  与其他基于UNIX的系统一样,Linux也可以被多个人同时使用。多用户功能能够让多人在单个Linux系统上拥有账户,并且保护自己的数据不被他人破坏。
376 0
|
存储 安全 网络安全
it网络构建及设备系统配置以及IT安全策略实施如何实现?
it网络构建及设备系统配置以及IT安全策略实施如何实现?
Etherpad配置及管理功能
Etherpad配置及管理功能
330 0
Etherpad配置及管理功能
|
C++
配置 C 和 C++ 环境
配置 C 和 C++ 环境
127 0
【视频】配置信息管理 的 使用方法(四):功能节点维护
用配置信息管理来功能节点的维护的演示。  
655 0
|
数据安全/隐私保护 Windows 安全