.NET 中配置从xml转向json方法示例详解
发布时间:2023-02-17 10:03:19 所属栏目:asp.Net 来源:互联网
导读:一、配置概述 在.net framework平台中我们常见的也是最熟悉的就是.config文件作为配置,控制台桌面程序是App.config,Web就是web.config,里面的配置格式为xml格式。 在xml里面有系统生成的配置项,也有我们自己添加的一些配置,最常用的就是appSettings节点
|
一、配置概述 在.net framework平台中我们常见的也是最熟悉的就是.config文件作为配置,控制台桌面程序是App.config,Web就是web.config,里面的配置格式为xml格式。 ![]() 在xml里面有系统生成的配置项,也有我们自己添加的一些配置,最常用的就是appSettings节点,用来配置数据库连接和参数。 使用的话就引用包System.Configuration.ConfigurationManager 之后取里面的配置信息: System.Configuration.ConfigurationManager.AppSettings["ConnectionString"] 随着技术的发展这种配置方式显得冗余复杂,如果配置项太多层级关系参数表达凌乱,在.net core开始也将配置的格式默认成了json格式,包括现在很多的其它配置也是支持的,比如java中常用的yaml格式,为什么能支持这么多读取源和格式,其实质在于配置提供程序。 目前.NET 中的配置是使用一个或多个配置提供程序执行的。 配置提供程序使用各种配置源从键值对读取配置数据,这些配置程序稍后我们会看到,读取的配置源可以是如下这些: 设置文件,appsettings.json 环境变量 Azure Key Vault Azure 应用配置 命令行参数 已安装或已创建的自定义提供程序 目录文件 内存中的 .NET 对象 第三方提供程序 二、配置初识 IConfiguration 接口是所有配置源的单个表示形式,给定一个或多个配置源,IConfiguration 类型提供配置数据的统一视图。 上图我们可能没有直观的感受,现在写一个例子来看看 (1). 新建控制台应用程序:创建控制台使用的是.net 6.0 框架,vs 2022。 安装 Microsoft.Extensions.Configuration.Json NuGet 包,该包提供json配置文件读取。 Install-Package Microsoft.Extensions.Configuration.Json (2). 添加appsettings.json 文件 { "person": { "name": "XSpringSun", "age": 18 } } (3). 使用json提供程序读取json配置new一个ConfigurationBuilder,添加json配置,AddJsonFile是在包中的IConfigurationBuilder扩展方法,其它配置提供程序也是用这种扩展方法实现。 static void Main(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build(); Console.WriteLine(configuration["person:name"]); Console.WriteLine(configuration["person:age"]); Console.WriteLine("Hello, World!"); Console.ReadLine(); } 可以看到已经取到json配置文件中的值了,配置值可以包含分层数据。 分层对象使用配置键中的 : 分隔符表示。在下面的调试对象中我们可以看到实际configuration的Providers 提供程序数组有一个值,就是我们的JsonConfigurationProvider,并且JsonConfigurationProvider里面已经读取了json的数据存储在Data数组中。 对于如上几行代码干了什么呢: 将 ConfigurationBuilder 实例化(new ConfigurationBuilder)。 添加 "appsettings.json" 文件,由 JSON 配置提供程序识别(AddJsonFile("appsettings.json"))。 使用 configuration 实例获取所需的配置 三、选项模式 这样已经实现json进行配置读取,但是取值的方式似乎和以前没什么太大变法,所以.net提供了选项模式,选项模式就是使用类来提供对相关设置组的强类型访问。 我们创建一个Config类用来转换json: namespace ConfigDemo { public class Config { public Person? person { get; set; } } public class Person { public string? name { get; set; } public int age { get; set; } } } 绑定配置 IConfiguration configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json") .Build(); Config options = new Config(); ConfigurationBinder.Bind(configuration, options); Person person = configuration.GetSection("person").Get<Person>(); Console.WriteLine(options.person.name); Console.WriteLine(options.person.age); Console.WriteLine("-----------GetSection获取-------------"); Console.WriteLine(person.name); Console.WriteLine(person.age); 用了两种方式获取配置,第一种使用ConfigurationBinder.Bind()将整个配置绑定到对象Config上,另外一种是使用IConfiguration的GetSection().Get<T>()并返回指定的类型。两种方式都可以使用,看实际需求和用途。 四、选项依赖注入 在控制台程序中我们引用DI注入包,然后演示下如何进行配置的注入。关于DI和IOC不清楚的看我上篇文章.net 温故知新:【7】IOC控制反转,DI依赖注入 新建一个测试类TestOptionDI public class TestOptionDI { private readonly IOptionsSnapshot<Config> _options; public TestOptionDI(IOptionsSnapshot<Config> options) { _options = options; } public void Test() { Console.WriteLine("DI测试输出:"); Console.WriteLine($"姓名:{_options.Value.person.name}"); Console.WriteLine($"年龄:{_options.Value.person.age}"); } } 在测试类中我们使用IOptionsSnapshot<T>接口作为依赖注入,还有其它不同定义的接口用来配置注入,关于选项接口:。 不同接口可以配合读取配置的不同方式起作用,IOptionsSnapshot接口可以在配置文件改变后不同作用域进行刷新配置。接着我们修改main方法,引入DI,并将AddJsonFile方法的参数reloadOnChange设置为true,optional参数是否验证文件存在,建议开发时都设置为true,这样如果文件有问题会进行报错。 注入配置这句services.AddOptions().Configure<Config>(e=>configuration.Bind(e))是关键,通过容器调用AddOptions方法注册,然后Configure方法里面是一个委托方法,该委托的作用就是将配置的信息绑定到Config类型的参数e上。注册到容器的泛型选项接口,这样在TestOptionDI类构造函数注入就能注入IOptionsSnapshot了,这里有点绕。 static void Main(string[] args) { IConfiguration configuration = new ConfigurationBuilder() .AddJsonFile("appsettings.json",optional:true,reloadOnChange:true) .Build(); (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – ASP.NET MVC 4 Visual Studio 2010项目模板
- asp.net – 如何在MVC 3中设置图表系列颜色?
- ASP.NET清空缓存时遇到的问题简析
- 在asp.net中使用eval(“”)
- asp.net – Oracle.ManagedDataAccess:TNS:无法解析指定的
- webservice的两种调用方式
- asp.net – 下载列表asp mvc
- asp.net – 登录后对Membership.GetAllUsers()的例外情况:
- ASP.Net下载大文件的实现方法
- asp.net-mvc-3 – 为MVC3应用程序配置Ninject的正确方法是什
推荐文章
站长推荐
- asp.net 上传或下载当文件名包含有特殊字符#的处
- asp.net-mvc – DotNetOpenAuth在ASP.NET MVC中的
- asp.net – 我可以重新发布或携带POST数据(如果是
- asp.net-mvc – 已经使用相同的参数类型定义了一
- asp.net-mvc – 依赖注入和ASP.Net成员提供程序
- 如何从asp.net调用Windows服务
- asp.net下使用jquery 的ajax+WebService+json 实
- asp.net-mvc – 如何在扩展方法中使用HTML帮助器
- asp.net-mvc-3 – 大量使用ViewBag
- asp.net-mvc – mvc razor @helper可以返回非编码
热点阅读

