C#配置系统
读取JSON文件
NuGet两个包:Microsoft.Extensions.Configuration,Mircosoft.Extensions.Configuration.Json。
{
"name": "yjw",
"age": 18,
"proxy": {"address": "aa"}
}
需要注意的是,上述json文件,需要设置为”如果较新则复制“,确保在exe同目录下复制该配置文件。
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("config.json", true, true);
IConfigurationRoot configRoot=configurationBuilder.Build();
string name = configRoot["name"];
var age = configRoot["age"];
Console.WriteLine(name);
string address = configRoot.GetSection("proxy:address").Value;
Console.WriteLine(address);
output:
yjw
aa
除了以上的操作,还可以帮定一个类,自动完成配置的读取,NuGet安装:Microsoft.Extensions.Configuration.Binder。
{
"name": "yjw",
"age": 18,
"proxy": {"address": "aa","port": "80"}
}
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Text;
namespace DITest
{
internal class Program1
{
static void Main()
{
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("config.json", true, true);
IConfigurationRoot configRoot=configurationBuilder.Build();
//GetSection返回IConfigurationSection类型,再使用其Get泛型方法,直接可以得到Proxy类
Proxy proxy =configRoot.GetSection("proxy").Get<Proxy>();
Console.WriteLine($"{proxy.address},{proxy.port}");
Console.ReadKey();
}
}
/// <summary>
/// 具备与json中的proxy里面的key相同的属性名称【首字母大小写都可以】
/// </summary>
class Proxy
{
public string address { get; set; }
public int port { get; set; }
}
}
output:
aa,80
当然也可以直接用一个类来bind根节点
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Text;
namespace DITest
{
internal class Program1
{
static void Main()
{
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("config.json", true, true);
IConfigurationRoot configRoot=configurationBuilder.Build();
Config config = configRoot.Get<Config>();
Console.WriteLine($"{config.Proxy.address},{config.Proxy.port},{config.Name},{config.Age}");
Console.ReadKey();
}
}
class Config
{
public string Name { get; set; }
public string Age { get; set; }
public Proxy Proxy { get; set; }
}
/// <summary>
/// 具备与json中的proxy里面的key相同的属性名称【首字母大小写都可以】
/// </summary>
class Proxy
{
public string address { get; set; }
public int port { get; set; }
}
}
output:
aa,80,yjw,18
选取方式读取
推荐使用选项方式读取,和DI结合更好,且更好利用”reloadOnChange“机制。
NuGet安装:Microsoft.Extensions.Options,Microsoft.Extensions.Configuration.Binder。
读取配置的时候,DI要声明IOptions<T>,IOptionsMonitor<T>,IOptionsSnapshot<T>等类型。IOptions<T>不会读取到新的值;和IOptionsMonitor相比,IOptionSnapshot<T>会在同一个范围内保持一致,因此,建议使用IOptionSnapshot。
Testontrollers.cs:
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Text;
namespace DITest
{
internal class TestControllers
{
private readonly IOptionsSnapshot<Config> optConfig;//通过IOptinosSnapshot,将配置类注入
public TestControllers(IOptionsSnapshot<Config> optConfig)//通过IOptinosSnapshot,将配置类注入
{
this.optConfig = optConfig;
}
public void Test()
{
Console.WriteLine(optConfig.Value.Name);//通过optConfig.Value获取Config实例
Console.WriteLine(optConfig.Value.Age);
}
}
}
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;
namespace DITest
{
internal class Program1
{
static void Main()
{
ServiceCollection sc = new ServiceCollection();
sc.AddScoped<TestControllers>();//注册TestControllers
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("config.json", true, true);
IConfigurationRoot configRoot=configurationBuilder.Build();
sc.AddOptions().Configure<Config>(e=>configRoot.Bind(e));//注册包裹在IOptionSnapshot中的Config
using(var sp = sc.BuildServiceProvider())
{
var c = sp.GetRequiredService<TestControllers>();
c.Test();
}
Console.ReadKey();
}
}
class Config
{
public string Name { get; set; }
public string Age { get; set; }
public Proxy Proxy { get; set; }
}
/// <summary>
/// 具备与json中的proxy里面的key相同的属性名称【首字母大小写都可以】
/// </summary>
class Proxy
{
public string address { get; set; }
public int port { get; set; }
}
}
output:
yjw
18
如果只绑定proxy:
/// <summary>
/// 只读proxy
/// </summary>
class TestControllers2
{
private readonly IOptionsSnapshot<Proxy> optProxy;
public TestControllers2(IOptionsSnapshot<Proxy> optProxy)
{
this.optProxy = optProxy;
}
public void Test()
{
Console.WriteLine(optProxy.Value.address);
Console.WriteLine(optProxy.Value.port);
}
}
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Text;
namespace DITest
{
internal class Program1
{
static void Main()
{
ServiceCollection sc = new ServiceCollection();
sc.AddScoped<TestControllers>();//注册TestControllers
sc.AddScoped<TestControllers2>();//注册TestControllers2
ConfigurationBuilder configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("config.json", true, true);
IConfigurationRoot configRoot=configurationBuilder.Build();
sc.AddOptions().Configure<Config>(e=>configRoot.Bind(e)).
Configure<Proxy>(e=>configRoot.GetSection("proxy").Bind(e));//绑定proxy
using(var sp = sc.BuildServiceProvider())
{
var c = sp.GetRequiredService<TestControllers2>();
c.Test();
}
Console.ReadKey();
}
}
class Config
{
public string Name { get; set; }
public string Age { get; set; }
public Proxy Proxy { get; set; }
}
/// <summary>
/// 具备与json中的proxy里面的key相同的属性名称【首字母大小写都可以】
/// </summary>
class Proxy
{
public string address { get; set; }
public int port { get; set; }
}
}
output:
aa
80
命令行方式配置
需要NuGet安装Microsoft.Extensions.Configuration.CommandLine
configBuilder.AddCommandLine(args)
参数支持多种格式,比如server=127.0.0.1,--server=127.0.0.1,--server 127.0.0.1,/server=127.0.0.1,/server 127.0.0.1
在cmd模式下:xxx.exe name=johnyang age=18
就可以得到该参数.
在VS中,可以在调试属性中,直接写入args
扁平化配置
对于环境变量,命令行等简单的键值对结构,如果想要进行复杂结构的配置,需要进行“扁平化处理”,对于配置的名字需要采用“层级配置”。
比如,json中的
{
"a":{"b":"c"},
"d":{e:[3,5,7]}
}
在cmd中配置为:
a:b:=c d:e:0=3 d:e:1=5 d:e:2=7
C#配置系统的更多相关文章
- .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?
配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...
- .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?
物理文件是我们最常用到的原始配置的载体,最佳的配置文件格式主要由三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...
- .NET Core采用的全新配置系统[1]: 读取配置数据
提到“配置”二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置定义在这两个文 ...
- .NET Core采用的全新配置系统[2]: 配置模型设计详解
在<.NET Core采用的全新配置系统[1]: 读取配置数据>中,我们通过实例的方式演示了几种典型的配置读取方式,其主要目的在于使读者朋友们从编程的角度对.NET Core的这个全新的配 ...
- .NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象
配置的原子结构就是单纯的键值对,并且键和值都是字符串,但是在真正的项目开发中我们一般不会单纯地以键值对的形式来使用配置.值得推荐的做法就是采用<.NET Core采用的全新配置系统[1]: 读取 ...
- .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]
较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...
- C# 读取app.config配置文件 节点键值,提示 "配置系统未能初始化" 错误的解决方案
新建C#项目,在app.config中添加了appSettings项,运行时出现"配置系统未能初始化"的错误,MSDN里写到,如果配置文件中包含 configSections 元素 ...
- App.config“配置系统未能初始化” 异常解决 C#
System.Configuration.ConfigurationManager.AppSettings["user"]; 时出现“配置系统未能初始化” 错误 解决办法: 如果配 ...
- CSipSimple配置系统
称作配置系统未免太大了一点,不过它的配置管理这一块确实有加以设计,一方面以增加灵活性,另一方面以支持第三方扩展.通过分析源码,粗略画出如下的结构图: 一.类分析 SharedPreference 一切 ...
- C# “配置系统未能初始化” 异常解决
使用App.config配置参数,读取参数出现错误 “System.Configuration.ConfigurationErrorsException”类型的未经处理的异常在 System.Conf ...
随机推荐
- C# List LinQ Lambda 表达式
------------恢复内容开始------------ # 参考链接 : https://blog.csdn.net/wori/article/details/113144580 首先 => ...
- ServerMmon青蛇探针,一个超好用的服务器状态监控-搭建教程
serverMmon(青蛇探针)是nodeJs开发的一个酷炫高逼格的云探针.云监控.服务器云监控.多服务器探针~. 在线演示:http://106.126.11.114:5880/ 主要功能: 全球服 ...
- SQL Server 2025 AI相关能力初探
SQL Server 在2024年11月开始进行社区私有预览(链接),由于涉及AI能力,我也是第一时间申请了内侧资格,悲剧的是,直到2025年2月,才拿到预览版的测试资格-.-,此时已经是CTP1.3 ...
- Oracle 23ai TPC-H 执行情况
TPC-H是一个广泛使用的基准测试,用于评估数据库系统在决策支持系统(DSS)场景下的性能. 在昨天的文章中,我们完成了<Oracle 23ai TPC-H 测试环境部署>,本文将继续记录 ...
- Window10永久暂停(禁用)自动更新
终于彻底设置window10不自动更新了(禁用自动更新) 设置成功后的标识 设置成功后,重启电脑再打开就会显示这样的,这个才是禁用成功的标识: 之前安装了window 10 ,但是window 10 ...
- Django的MVT模式和Spring的MVC模式类比
Spring的MVC模式 MVC: Model-View-Controller 模型-视图-控制器 M: 数据处理 V: 界面显示 C: 逻辑处理 最开始用于Desktop程序开发,现在已被广泛使用, ...
- 找到占用磁盘最多的文件或目录,可以使用du和sort
想要找到占用磁盘最多的文件或目录,可以使用du和sort命令: du -h /path/to/directory | sort -rh | head -n 10 其中: du -h /path/t ...
- TaskPyro:一个轻量级的 Python 任务调度和爬虫管理平台
前言 推荐一款本人在使用的Python爬虫管理平台,亲测不错!!! TaskPyro 是什么? TaskPyro 是一个轻量级的 Python 任务调度平台,专注于提供简单易用的任务管理和爬虫调度解决 ...
- RabbitMQ 延迟任务(限时订单) 思路
一.场景 我们经常会碰见,一个需求就是,发送一条指令(消息),延迟一段时间执行,比如说常见的淘宝当下了一个订单后,订单支付时间为半个小时,如果半个小时没有支付,则关闭该订单.当然实现的方式有几种,今天 ...
- 文字像素(.NET)
无图言* 代码实现 新建一个控制台应用程序, 调整 Program.cs 文件内容如下: using System; using System.Drawing; namespace ConsoleAp ...