日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

.NET 中配置從xml轉(zhuǎn)向json方法示例詳解

瀏覽:896日期:2022-06-09 10:47:37
目錄
  • 一、配置概述
  • 二、配置初識(shí)
  • 三、選項(xiàng)模式
  • 四、選項(xiàng)依賴注入
  • 五、其它配置
  • 六、托管模式

一、配置概述

在.net framework平臺(tái)中我們常見的也是最熟悉的就是.config文件作為配置,控制臺(tái)桌面程序是App.config,Web就是web.config,里面的配置格式為xml格式。

在xml里面有系統(tǒng)生成的配置項(xiàng),也有我們自己添加的一些配置,最常用的就是appSettings節(jié)點(diǎn),用來配置數(shù)據(jù)庫連接和參數(shù)。

使用的話就引用包System.Configuration.ConfigurationManager 之后取里面的配置信息:

System.Configuration.ConfigurationManager.AppSettings["ConnectionString"]

隨著技術(shù)的發(fā)展這種配置方式顯得冗余復(fù)雜,如果配置項(xiàng)太多層級(jí)關(guān)系參數(shù)表達(dá)凌亂,在.net core開始也將配置的格式默認(rèn)成了json格式,包括現(xiàn)在很多的其它配置也是支持的,比如java中常用的yaml格式,為什么能支持這么多讀取源和格式,其實(shí)質(zhì)在于配置提供程序。

目前.NET 中的配置是使用一個(gè)或多個(gè)配置提供程序執(zhí)行的。 配置提供程序使用各種配置源從鍵值對(duì)讀取配置數(shù)據(jù),這些配置程序稍后我們會(huì)看到,讀取的配置源可以是如下這些:

  • 設(shè)置文件,appsettings.json
  • 環(huán)境變量
  • Azure Key Vault
  • Azure 應(yīng)用配置
  • 命令行參數(shù)
  • 已安裝或已創(chuàng)建的自定義提供程序
  • 目錄文件
  • 內(nèi)存中的 .NET 對(duì)象
  • 第三方提供程序

二、配置初識(shí)

IConfiguration 接口是所有配置源的單個(gè)表示形式,給定一個(gè)或多個(gè)配置源,IConfiguration 類型提供配置數(shù)據(jù)的統(tǒng)一視圖。

上圖我們可能沒有直觀的感受,現(xiàn)在寫一個(gè)例子來看看

(1). 新建控制臺(tái)應(yīng)用程序:創(chuàng)建控制臺(tái)使用的是.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一個(gè)ConfigurationBuilder,添加json配置,AddJsonFile是在包中的IConfigurationBuilder擴(kuò)展方法,其它配置提供程序也是用這種擴(kuò)展方法實(shí)現(xiàn)。

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();}

可以看到已經(jīng)取到j(luò)son配置文件中的值了,配置值可以包含分層數(shù)據(jù)。 分層對(duì)象使用配置鍵中的 : 分隔符表示。在下面的調(diào)試對(duì)象中我們可以看到實(shí)際configuration的Providers 提供程序數(shù)組有一個(gè)值,就是我們的JsonConfigurationProvider,并且JsonConfigurationProvider里面已經(jīng)讀取了json的數(shù)據(jù)存儲(chǔ)在Data數(shù)組中。

對(duì)于如上幾行代碼干了什么呢:

  • 將 ConfigurationBuilder 實(shí)例化(new ConfigurationBuilder)。
  • 添加 "appsettings.json" 文件,由 JSON 配置提供程序識(shí)別(AddJsonFile("appsettings.json"))。
  • 使用 configuration 實(shí)例獲取所需的配置

三、選項(xiàng)模式

這樣已經(jīng)實(shí)現(xiàn)json進(jìn)行配置讀取,但是取值的方式似乎和以前沒什么太大變法,所以.net提供了選項(xiàng)模式,選項(xiàng)模式就是使用類來提供對(duì)相關(guān)設(shè)置組的強(qiáng)類型訪問。

我們創(chuàng)建一個(gè)Config類用來轉(zhuǎn)換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()將整個(gè)配置綁定到對(duì)象Config上,另外一種是使用IConfiguration的GetSection().Get<T>()并返回指定的類型。兩種方式都可以使用,看實(shí)際需求和用途。

四、選項(xiàng)依賴注入

在控制臺(tái)程序中我們引用DI注入包,然后演示下如何進(jìn)行配置的注入。關(guān)于DI和IOC不清楚的看我上篇文章.net 溫故知新:【7】IOC控制反轉(zhuǎn),DI依賴注入

  • 新建一個(gè)測(cè)試類TestOptionDI
    public class TestOptionDI    {private readonly IOptionsSnapshot<Config> _options;public TestOptionDI(IOptionsSnapshot<Config> options){    _options = options;}public void Test(){    Console.WriteLine("DI測(cè)試輸出:");    Console.WriteLine($"姓名:{_options.Value.person.name}");    Console.WriteLine($"年齡:{_options.Value.person.age}");}    }

在測(cè)試類中我們使用IOptionsSnapshot<T>接口作為依賴注入,還有其它不同定義的接口用來配置注入,關(guān)于選項(xiàng)接口:。

不同接口可以配合讀取配置的不同方式起作用,IOptionsSnapshot接口可以在配置文件改變后不同作用域進(jìn)行刷新配置。接著我們修改main方法,引入DI,并將AddJsonFile方法的參數(shù)reloadOnChange設(shè)置為true,optional參數(shù)是否驗(yàn)證文件存在,建議開發(fā)時(shí)都設(shè)置為true,這樣如果文件有問題會(huì)進(jìn)行報(bào)錯(cuò)。

注入配置這句services.AddOptions().Configure<Config>(e=>configuration.Bind(e))是關(guān)鍵,通過容器調(diào)用AddOptions方法注冊(cè),然后Configure方法里面是一個(gè)委托方法,該委托的作用就是將配置的信息綁定到Config類型的參數(shù)e上。注冊(cè)到容器的泛型選項(xiàng)接口,這樣在TestOptionDI類構(gòu)造函數(shù)注入就能注入IOptionsSnapshot了,這里有點(diǎn)繞。

static void Main(string[] args){    IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json",optional:true,reloadOnChange:true).Build();    //IServiceCollection 服務(wù)    ServiceCollection services = new ServiceCollection();    //注入配置    services.AddOptions().Configure<Config>(e=>configuration.Bind(e));    //注入TestOptionDI    services.AddScoped<TestOptionDI>();    using (var provider = services.BuildServiceProvider())    {//獲取服務(wù)var testOption = provider.GetRequiredService<TestOptionDI>();testOption.Test();    }    Console.ReadLine();}

為了測(cè)試IOptionsSnapshot接口在不同作用域會(huì)刷新配置,我們修改下main方法,用一個(gè)while循環(huán)在ReadLine時(shí)修改json文件值,不同的Scope里進(jìn)行打印。

    using (var provider = services.BuildServiceProvider())    {while (true){    using (var scope = provider.CreateScope())    {//獲取服務(wù)var testOption = scope.ServiceProvider.GetRequiredService<TestOptionDI>();testOption.Test();    }    Console.ReadLine();}    }

這個(gè)功能在web中使用很方便,因?yàn)榭蚣艿囊淮握?qǐng)求就是一個(gè)作用域,所以我們修改了配置,下次請(qǐng)求就能生效了,而不用重啟服務(wù)。

五、其它配置

如最開始所說,不僅能配置json文件,由于各種提供程序,還可以配置其它的,但是根據(jù)配置的順序會(huì)進(jìn)行覆蓋。我們只添加一個(gè)環(huán)境變量配置演示下:

首先添加提供程序包:Install-Package Microsoft.Extensions.Configuration.EnvironmentVariables
然后添加環(huán)境變量配置代碼AddEnvironmentVariables()

IConfiguration configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json",optional:true,reloadOnChange:true).AddEnvironmentVariables().Build();

在VS中配置臨時(shí)環(huán)境變量

這里有個(gè)扁平化配置,就是表示層級(jí)用冒號(hào)person:age

六、托管模式

對(duì)于web項(xiàng)目我們沒有進(jìn)行這么多操作它是怎么配置的呢,其實(shí)框架已經(jīng)自動(dòng)幫我們做了,其它非web項(xiàng)目也可以使用這種托管模式,在Microsoft.Extensions.Hosting 包中,只需要使用簡單的代碼就能配置好。

IHost host = Host.CreateDefaultBuilder(args).Build();await host.RunAsync();

其加載配置的優(yōu)先級(jí):

通過分析我們對(duì)整個(gè)配置如何運(yùn)行的機(jī)制有了一個(gè)大體的了解,如果想詳細(xì)了解托管模式的還是建議看官方文檔:.NET配置

以上就是.NET 中配置從xml轉(zhuǎn)向json方法示例詳解的詳細(xì)內(nèi)容,更多關(guān)于.NET配置xml轉(zhuǎn)向json的資料請(qǐng)關(guān)注其它相關(guān)文章!

標(biāo)簽: ASP.NET
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩国产欧美| 青青国产精品| 欧美成人一二区| 欧美一区二区三区久久精品| 91精品尤物| 久久天堂影院| 久久精品青草| 国产探花一区二区| 综合激情网...| 日韩欧美中文字幕电影| 欧美久久精品| 色一区二区三区| 亚洲经典在线| 日韩精品视频网| 国产成人精品一区二区三区视频 | 国产日韩一区二区三区在线| 亚洲二区免费| 日本成人手机在线| 日韩欧美精品一区| 蜜桃av一区二区在线观看| 国产精品一区二区精品| 久久精品国产www456c0m| 亚洲欧美网站在线观看| 麻豆精品视频在线观看| 亚洲综合日韩| 国产成人免费精品| 99视频一区| 久久精品国产网站| 中文一区一区三区免费在线观 | 不卡一区2区| 日韩视频一二区| 亚洲国产专区校园欧美| 亚洲理论在线| 最新中文字幕在线播放 | 国产一区二区视频在线看| 少妇精品导航| 久久精品 人人爱| 亚洲激情中文在线| 国产v综合v| 日本v片在线高清不卡在线观看| 91一区二区| 免费观看在线色综合| 久久精品91| 欧美日一区二区在线观看| 首页亚洲欧美制服丝腿| 视频二区不卡| 91欧美在线| 国产精品s色| 国产欧美日韩综合一区在线播放| 9国产精品视频| 九九久久电影| 亚洲高清久久| 99久久久久国产精品| 裤袜国产欧美精品一区| 日韩精品a在线观看91| 中文久久精品| 久久精品国产亚洲夜色av网站 | 免播放器亚洲| 国产免费成人| 99国产精品久久久久久久成人热| 久久久精品日韩| 国产91在线播放精品| 久久精品国产99国产精品| 欧美日韩亚洲一区在线观看| 综合激情婷婷| 青草国产精品| 久久精品资源| 国产日产精品_国产精品毛片 | 在线亚洲观看| 亚洲综合小说| 欧美精品国产| 在线亚洲人成| 亚洲v在线看| 欧美一级专区| 国产精品欧美日韩一区| 国产高潮在线| 视频一区二区国产| 免费在线亚洲| 激情六月综合| 日韩精品五月天| 欧美国产偷国产精品三区| 欧美日韩在线二区| 久久国产精品久久久久久电车| 亚洲aa在线| 亚洲黄色免费av| 亚洲字幕久久| 日韩影院二区| 国产精品美女| 精品视频国产| 国产麻豆综合| 日韩电影二区| 国产欧美日韩综合一区在线播放| 色老板在线视频一区二区| 亚洲深深色噜噜狠狠爱网站| 大香伊人久久精品一区二区| 热久久免费视频| 99精品在线观看| 国产欧美日韩免费观看| 久久精品青草| 精品久久网站| 欧美偷窥清纯综合图区| 午夜宅男久久久| 精品一区二区三区中文字幕视频 | 免费人成网站在线观看欧美高清| 欧美在线黄色| 欧美精品激情| 欧美aa在线观看| 国产精品久久久久久妇女| 国产视频一区免费看| 久久激情婷婷| 天堂av在线| 精品网站aaa| 久久国产麻豆精品| 亚洲一区二区三区久久久| 亚洲网站视频| 国产中文在线播放| 精品久久不卡| 国产va免费精品观看精品视频| 欧美亚洲三级| 国产剧情一区二区在线观看| 久久国产视频网| 国产欧美日韩精品一区二区免费| 日韩二区在线观看| 日韩av在线免费观看不卡| 视频国产精品| 欧美天堂一区| 精品三级在线| 日韩电影免费网址| 欧美+亚洲+精品+三区| 日韩免费一区| 在线日韩欧美| 亚洲精选成人| 国产精品99久久久久久董美香| 欧美激情一区| 久久久精品日韩| 三级欧美在线一区| 日韩av网站在线免费观看| 欧美国产亚洲精品| 老牛影视精品| 视频一区二区三区入口| 久久精品天堂| 日本中文字幕一区二区| 欧美视频精品全部免费观看| 久久久亚洲欧洲日产| 极品av在线| 欧美午夜不卡影院在线观看完整版免费| 亚洲欧美久久| 九九99久久精品在免费线bt| 欧美色图国产精品| 欧美日本不卡| 女主播福利一区| 国产精品美女午夜爽爽| 久久蜜桃资源一区二区老牛| 亚洲精选91| 亚洲va中文在线播放免费| 日韩一区二区三免费高清在线观看| 欧美www视频在线观看| 亚洲资源网站| 亚洲视频综合| 国产精品nxnn| 视频一区欧美精品| 亚洲人成在线网站| 欧美精品影院| 综合国产在线| 欧美日中文字幕| 91一区二区三区四区| 欧美日韩亚洲一区在线观看| 亚洲网站视频| 国产精品国产三级国产在线观看| 在线看片日韩| 亚洲一区国产| 免费观看久久av| 蜜桃精品在线| 亚洲国产欧美日本视频| 日韩av中文在线观看| 国产偷自视频区视频一区二区| 日韩欧美一区二区三区免费看| 国产视频网站一区二区三区| 亚洲三级视频| 一区二区三区四区精品视频| 欧美日韩国产综合网| 99视频精品全部免费在线视频| 久久精品国产久精国产| 国产精品美女午夜爽爽| 欧美一区网站| 国产欧美91| 国产经典一区| 国产欧美自拍| 国产激情精品一区二区三区| 99日韩精品| 99视频一区| av亚洲在线观看| 99久久亚洲精品蜜臀| 亚洲大片在线| 亚洲激情偷拍| 亚洲日本国产| 国产亚洲一区二区三区不卡| 日韩不卡一区二区三区| 欧美综合精品| 丁香婷婷久久|