成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

.NET 中配置從xml轉向json方法示例詳解

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

一、配置概述

在.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();    //IServiceCollection 服務    ServiceCollection services = new ServiceCollection();    //注入配置    services.AddOptions().Configure<Config>(e=>configuration.Bind(e));    //注入TestOptionDI    services.AddScoped<TestOptionDI>();    using (var provider = services.BuildServiceProvider())    {//獲取服務var testOption = provider.GetRequiredService<TestOptionDI>();testOption.Test();    }    Console.ReadLine();}

為了測試IOptionsSnapshot接口在不同作用域會刷新配置,我們修改下main方法,用一個while循環在ReadLine時修改json文件值,不同的Scope里進行打印。

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

這個功能在web中使用很方便,因為框架的一次請求就是一個作用域,所以我們修改了配置,下次請求就能生效了,而不用重啟服務。

五、其它配置

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

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

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

在VS中配置臨時環境變量

這里有個扁平化配置,就是表示層級用冒號person:age

六、托管模式

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

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

其加載配置的優先級:

通過分析我們對整個配置如何運行的機制有了一個大體的了解,如果想詳細了解托管模式的還是建議看官方文檔:.NET配置

以上就是.NET 中配置從xml轉向json方法示例詳解的詳細內容,更多關于.NET配置xml轉向json的資料請關注其它相關文章!

標簽: ASP.NET
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
久久99深爱久久99精品| 午夜精品亚洲一区二区三区嫩草| 激情av综合网| 久久久久久9| 欧美资源在线| 亚洲综合一区在线| 影音先锋中文字幕一区| 中文字幕免费在线观看视频一区| 99精品热视频| 精品福利一区二区三区 | 国产精品一品二品| 欧美在线看片a免费观看| 亚洲h在线观看| 久久天天综合| 7777精品伊人久久久大香线蕉超级流畅 | 日日噜噜夜夜狠狠视频欧美人| 国产精品永久| 丝袜诱惑亚洲看片| 久久午夜av| 日韩av不卡一区二区| 色哟哟一区二区在线观看| 天堂午夜影视日韩欧美一区二区| 亚洲欧美不卡| 亚洲国产cao| 亚洲欧美日韩在线观看a三区| 亚洲免费伊人电影| 国产日韩欧美综合精品| 亚洲国产精品久久久久婷婷884| 亚洲九九精品| 亚洲一区二区三区四区中文字幕| 久久成人一区| 五月婷婷另类国产| 一本一道久久a久久精品| 免费观看成人av| 91精品国产综合久久久久久| 国产乱码精品一品二品| 欧美成人高清电影在线| 91在线porny国产在线看| 中文字幕+乱码+中文字幕一区| 国产精品二区二区三区| 亚洲男同性视频| 老司机一区二区三区| 美女一区二区在线观看| 欧美精品久久天天躁| 国产91精品一区二区麻豆亚洲| 精品88久久久久88久久久| 91免费观看在线| 亚洲日本一区二区三区| 久久精品人人| 国产一区激情在线| 久久久国产一区二区三区四区小说| 欧美三级免费| 一区二区三区不卡视频| 精品视频色一区| 国产jizzjizz一区二区| 日本一区二区三区视频视频| 一级成人国产| 久草这里只有精品视频| 久久人人97超碰com| 亚洲日本成人| 美女爽到高潮91| 欧美成人一区二区三区在线观看 | 日韩欧美成人午夜| 91麻豆精品秘密| 亚洲一区在线观看免费观看电影高清| 色噜噜狠狠成人中文综合| 高清国产一区二区| 国产精品久久久久7777按摩| 国产精品试看| 国产不卡视频在线观看| 国产精品免费网站在线观看| 久久精品亚洲一区二区| 国产999精品久久| 一区二区三区国产| 717成人午夜免费福利电影| 欧美日韩综合另类| 美美哒免费高清在线观看视频一区二区 | 久久午夜精品| 精品写真视频在线观看 | 精品亚洲成av人在线观看| 国产欧美一区二区三区在线老狼| 亚洲永久网站| 国产精品99久久久久久宅男| 国产精品免费免费| 色天使色偷偷av一区二区| 成人美女视频在线看| 亚洲愉拍自拍另类高清精品| 3d成人动漫网站| 亚洲欧洲精品一区二区三区波多野1战4| 男人的天堂久久精品| 国产偷国产偷精品高清尤物| 色噜噜狠狠色综合欧洲selulu| 色综合中文字幕国产 | 亚洲性图久久| 久久66热re国产| 国产精品美女久久久久久| 欧美三级三级三级爽爽爽| 亚洲福利专区| 国产成人免费视频一区| 亚洲一区二区三区自拍| 久久久久久久综合狠狠综合| 日本韩国精品在线| 国产精品国码视频| 国产麻豆精品在线| 亚洲精品成人在线| 精品欧美一区二区久久| 一本久久a久久免费精品不卡| 欧美日韩国产在线一区| 国产激情一区二区三区四区| 五月婷婷激情综合网| 国产农村妇女毛片精品久久麻豆| 欧美午夜精品一区二区三区| 亚洲电影成人| 北条麻妃国产九九精品视频| 天天av天天翘天天综合网| 国产精品网站导航| 欧美一级日韩免费不卡| 久久久国产精品一区二区中文| 丁香婷婷综合色啪| 亚洲成av人片一区二区| 亚洲国产精品成人综合| 91精品国产手机| 亚洲中午字幕| 亚洲午夜极品| 成人三级伦理片| 麻豆免费精品视频| 亚洲午夜激情av| 欧美韩日一区二区三区| 欧美一区二区三区四区视频| 久久午夜精品| 中文高清一区| 伊人婷婷久久| 欧美三级网页| 91蝌蚪国产九色| 国产成人欧美日韩在线电影| 美女性感视频久久| 亚洲va国产天堂va久久en| 亚洲天堂精品视频| 国产欧美日韩激情| 精品国产乱子伦一区| 欧美日韩一区二区三区四区五区 | 国产欧美精品一区二区三区四区 | 在线成人av影院| 色噜噜夜夜夜综合网| 日韩视频一区| 狠狠干成人综合网| 91免费看片在线观看| 国产精品亚洲成人| 美女高潮久久久| 五月综合激情网| 亚洲成人综合网站| 亚洲精品一二三| 国产精品国产a级| 国产亚洲欧美中文| 精品1区2区在线观看| 91精品久久久久久久99蜜桃| 欧美日韩免费不卡视频一区二区三区| 午夜综合激情| 国产伦精品一区二区三区视频黑人 | 久久狠狠一本精品综合网| 亚洲看片一区| 亚洲视频综合| 红桃视频国产一区| 欧美极品一区二区三区| 91污在线观看| 99久精品国产| 99在线视频精品| www.欧美日韩国产在线| 99久久综合精品| 99久久99久久综合| 色综合久久综合网97色综合 | 国产区在线观看成人精品| 久久亚洲影视婷婷| 精品国一区二区三区| 亚洲精品在线观看网站| 26uuu久久综合| 久久久电影一区二区三区| 久久综合久久久久88| 精品国产一区二区三区久久影院 | 国产精品一区二区久久精品爱涩| 精品一区二区三区免费毛片爱 | 激情丁香综合| 在线精品亚洲| 亚洲一区二区三区四区五区午夜| 亚洲制服av| 在线观看视频一区二区欧美日韩 | 亚洲女女做受ⅹxx高潮| 亚洲欧美视频一区| 夜夜嗨av一区二区三区网页| 亚洲国产欧美日韩另类综合 | 欧美成人一区二区三区片免费| 久久综合久久99| 国产精品情趣视频| 亚洲综合激情另类小说区| 偷拍一区二区三区| 日本在线不卡一区| 国模冰冰炮一区二区| 成人黄色软件下载| 国产主播一区二区三区四区| 亚洲国产精选|