日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

五分钟了解dotnetcore配置框架

發(fā)布時(shí)間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 五分钟了解dotnetcore配置框架 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

配置的本質(zhì)就是字符串的鍵值對(duì),微軟的一系列接口其實(shí)就是對(duì)這些鍵值對(duì)字符串的抽象。

二、基本類型

2.1、Nuget包

  • Microsoft.Extensions.Configuration.Abstractions

  • Microsoft.Extensions.Configuration

2.2、抽象接口

  • IConfiguration

    • 提供了查詢、設(shè)置配置項(xiàng)、監(jiān)控變化等方法

  • IConfigurationRoot

    • 在IConfiguration接口基礎(chǔ)上,增加了 Reload 方法強(qiáng)制從provider中重新加載配置值

  • IConfigurationSection

    • 對(duì)配置節(jié)點(diǎn)的抽象

  • IConfigurationBuilder

    • 根據(jù)提供的數(shù)據(jù)源注冊(cè)并構(gòu)建IConfiguration

  • IConfigurationSource

    • 對(duì)數(shù)據(jù)源的抽象,例如Json、xml、環(huán)境變量、內(nèi)存變量等

  • IConfigurationProvider

    • 規(guī)定了配置項(xiàng)的獲取、設(shè)置、重載等統(tǒng)一的行為

三、基本配置

注:各種配置方式的目的是在控制臺(tái)中輸出以下內(nèi)容,如下圖:

3.1、加載內(nèi)存中的配置

  • 需要引入包:Microsoft.Extensions.Configuration

  • 主要方法:builder.AddInMemoryCollection()

static void Main(string[] args) {IConfigurationBuilder builder = new ConfigurationBuilder();var memoryData = new Dictionary<string, string>();memoryData.Add("Student:Code", "10002385");memoryData.Add("Student:Name", "LiuSan");builder.AddInMemoryCollection(memoryData);IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}"); Console.Read(); }

3.2、加載環(huán)境變量中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.EnvironmentVariables

  • 主要方法:builder.AddEnvironmentVariables()

  • 環(huán)境變量中層級(jí)關(guān)系使用 __ 代替 :

static void Main(string[] args) {IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddEnvironmentVariables();IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read(); }

3.3、加載命令行中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.CommandLine

  • 主要方法:builder.AddCommandLine(args)

  • 命令行中使用--表示配置項(xiàng),層級(jí)關(guān)系使用:

  • 主要在docker中使用

static void Main(string[] args) {IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddCommandLine(args);IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read(); }

3.4、加載Json中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.Json

  • 主要方法:builder.AddJsonFile("appsettings.json")

static void Main(string[] args) {IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json");IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read(); }

3.5、加載xml中的配置

  • 需要引入包:Microsoft.Extensions.Configuration.Xml

  • 主要方法:builder.AddXmlFile("appsettings.xml")

  • xml中不會(huì)讀取最外層,所以Section必需從第二層開(kāi)始

static void Main(string[] args) {IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddXmlFile("appsettings.xml");IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");Console.Read(); }

四、高級(jí)配置

4.1、將配置綁定至強(qiáng)對(duì)象

  • 需要引入包:Microsoft.Extensions.Configuration.Binder

  • 主要方法:configurationRoot.GetSection("Student").Bind(student)

class Program{static void Main(string[] args){IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json");IConfigurationRoot configurationRoot = builder.Build();var student = new Student();configurationRoot.GetSection("Student").Bind(student);Console.WriteLine($"Code:{student.Code}");Console.WriteLine($"Name:{student.Name}");Console.Read();}}class Student{public string Code { get; set; }public string Name { get; set; }}

4.2、IOptions

  • 需要引入包:Microsoft.Extensins.Options

  • 需要引入包:Microsoft.Extensions.Options.ConfigurationExtensions

  • 本質(zhì)其實(shí)就是將一個(gè)Section配置節(jié)點(diǎn)映射到一個(gè)實(shí)體對(duì)象

class Program{static void Main(string[] args){IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json");IConfigurationRoot configurationRoot = builder.Build();IServiceCollection services = new ServiceCollection();services.Configure<WeixinOptions>(configurationRoot.GetSection("WeixinSetting"));services.AddScoped<IWeixinService, WeixinService>();var provider = services.BuildServiceProvider();var weixinService = provider.GetService<IWeixinService>();string appId = weixinService.AppId;string token = weixinService.Token;Console.Read();}}interface IWeixinService{string AppId { get; }string Token { get; }}class WeixinService: IWeixinService{IOptions<WeixinOptions> _options;public WeixinService(IOptions<WeixinOptions> options){_options = options;}public string AppId { get => _options.Value.AppId; }public string Token { get => _options.Value.Token;}}class WeixinOptions{public string AppId { get; set; }public string Token { get; set; }}

4.3、熱更新

  • IConfigurationBuilder添加數(shù)據(jù)源時(shí)設(shè)置reloadOnChange=true

  • 監(jiān)聽(tīng)的核心方法:var token = configurationRoot.GetReloadToken();

static void Main(string[] args){IConfigurationBuilder builder = new ConfigurationBuilder();builder.AddJsonFile("appsettings.json", optional:false, reloadOnChange:true);IConfigurationRoot configurationRoot = builder.Build();IConfigurationSection configurationSection = configurationRoot.GetSection("Student");var token = configurationRoot.GetReloadToken();ChangeToken.OnChange(() => configurationRoot.GetReloadToken(), () => {Console.WriteLine("配置發(fā)生改變了...");Console.WriteLine($"Code:{configurationSection["Code"]}");Console.WriteLine($"Name:{configurationSection["Name"]}");}); Console.Read();}


五、總結(jié)

  • 配置就是key-value鍵值對(duì)字符串

  • IConfiguration和IConfigurationRoot是對(duì)鍵值對(duì)的抽象

  • IConfigurationBuilder用于構(gòu)建IConfiguration和IConfigurationRoot

  • IConfigurationSource是對(duì)數(shù)據(jù)源的抽象

  • IConfigurationProvider將不同來(lái)源的IConfigurationSource 轉(zhuǎn)為統(tǒng)一的模型

  • IOptions方便將不同的配置節(jié)點(diǎn)(Path)映射為對(duì)應(yīng)的強(qiáng)類型對(duì)象

  • IConfigurationBuilder添加多個(gè)數(shù)據(jù)源(IConfigurationSource)后,如果key重名,則以最后一個(gè)配置為準(zhǔn)(覆蓋前面)

總結(jié)

以上是生活随笔為你收集整理的五分钟了解dotnetcore配置框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。