最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET?Core讀取配置文件的方法

 更新時(shí)間:2021年11月24日 17:15:03   作者:暢飲無(wú)緒  
這篇文章介紹了.NET?Core讀取配置文件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

配置文件是每個(gè)項(xiàng)目最基礎(chǔ)的部分,也是不可或缺的部分,比如:數(shù)據(jù)庫(kù)連接、中間件屬性等常見(jiàn)的配置。

今天這篇文章主要內(nèi)容就是,在.Net Core項(xiàng)目中怎樣去讀取配置文件并使用。

提前準(zhǔn)備

appsettings.json 文件

{
  "User": {
	"userName": "趙一",
	"userAge": 18
  }
}

對(duì)應(yīng)實(shí)體模型

public class UserOption
{
	public string userName { get; set; }
	public int userAge { get; set; }
}

常規(guī)讀取

1、注冊(cè)

在 startup 類(lèi)中注冊(cè),主要用到的是 Configure 方法:

services.Configure<UserOption>(Configuration.GetSection("User"));

2、控制器中注入并讀取

public class HomeController : ControllerBase
{
    private readonly UserOption user;

    public HomeController(IOptions<UserOption> userOptions)
    {
        user = userOptions.Value;
    }

    [HttpGet]
    public string Get()
    {
        return $"姓名:{user.userName},年齡:{user.userAge} ";
    }
}

輸出結(jié)果:姓名:趙一,年齡:18

嵌套讀取

我們對(duì) appsettings.json 文件做一點(diǎn)小小的改動(dòng),增加一個(gè)子節(jié)點(diǎn) child

{
  "User": {
	"userName": "趙一",
	"userAge": 18,
	"child": {
	  "userName": "趙一的崽",
	  "userAge": 2
	}
  }
}

再對(duì)注冊(cè)的代碼做一點(diǎn)小小的修改:

services.Configure<UserOption>(Configuration.GetSection("User:child"));

輸出結(jié)果:姓名:趙一的崽,年齡:2

分實(shí)例讀取

這個(gè)時(shí)候需求又有變化了,需要同時(shí)讀取 Userchild 節(jié)點(diǎn)的數(shù)據(jù),我們?cè)囋囅旅娴姆椒纯尚胁豢尚校?/p>

// 注冊(cè)
services.Configure<UserOption>(Configuration.GetSection("User"));
services.Configure<UserOption>(Configuration.GetSection("User:child"));
// 控制器
public class HomeController : ControllerBase
{
    private readonly UserOption user;
    private readonly UserOption child;

    public HomeController(IOptions<UserOption> userOptions, IOptions<UserOption> childOptions)
    {
        user = userOptions.Value;
        child = childOptions.Value;
    }

    [HttpGet]
    public string Get()
    {
        return $"姓名:{user.userName},年齡:{user.userAge} \r\n姓名:{child.userName},年齡:{child.userAge}";
    }
}

輸出結(jié)果很顯然滿(mǎn)足不了我們的需求:

姓名:趙一的崽,年齡:2
姓名:趙一的崽,年齡:2

有的小伙伴肯定會(huì)說(shuō),在實(shí)體模型內(nèi)在加一個(gè)子節(jié)點(diǎn)字段。這樣肯定是沒(méi)問(wèn)題的,但是與常規(guī)讀取方式就沒(méi)什么兩樣了。

這里我要說(shuō)的是分實(shí)例讀取,引入 Configure 的另一個(gè)重載方法,與之前不同的是多了一個(gè)參數(shù) name

public static IServiceCollection Configure<TOptions>(this IServiceCollection services, string name, IConfiguration config) where TOptions : class;

下面我們重新注冊(cè):

services.Configure<UserOption>("father", Configuration.GetSection("User"));
services.Configure<UserOption>("son", Configuration.GetSection("User:child"));

在控制器構(gòu)造函數(shù)中注入,也引入了一個(gè)新的接口對(duì)象:IOptionsMonitor

public class HomeController : ControllerBase
{
    private readonly UserOption user;
    private readonly UserOption child;

    public HomeController(IOptionsMonitor<UserOption> userOptions, IOptionsMonitor<UserOption> childOptions)
    {
        user = userOptions.Get("father");
        child = childOptions.Get("son");
    }

    [HttpGet]
    public string Get()
    {
        return $"姓名:{user.userName},年齡:{user.userAge} \r\n姓名:{child.userName},年齡:{child.userAge}";
    }

輸出結(jié)果:

姓名:趙一,年齡:18
姓名:趙一的崽,年齡:2

其實(shí)還有一個(gè)接口對(duì)象能實(shí)現(xiàn)這樣的效果:IOptionsSnapshot,那 IOptionsMonitorIOptionsSnapshot 有什么不同呢?請(qǐng)接著往下看。

IOptionsMonitor與IOptionsSnapshot的不同之處

我們先來(lái)看看微軟官方的注釋?zhuān)?/p>

IOptionsMonitor

//
// 摘要:
//     Used for notifications when TOptions instances change.
//
// 類(lèi)型參數(shù):
//   TOptions:
//     The options type.
public interface IOptionsMonitor<out TOptions>
{
    //
    // 摘要:
    //     Returns the current TOptions instance with the Microsoft.Extensions.Options.Options.DefaultName.
    TOptions CurrentValue { get; }

    //
    // 摘要:
    //     Returns a configured TOptions instance with the given name.
    TOptions Get(string name);
    //
    // 摘要:
    //     Registers a listener to be called whenever a named TOptions changes.
    //
    // 參數(shù):
    //   listener:
    //     The action to be invoked when TOptions has changed.
    //
    // 返回結(jié)果:
    //     An System.IDisposable which should be disposed to stop listening for changes.
    IDisposable OnChange(Action<TOptions, string> listener);
}

IOptionsSnapshot

//
// 摘要:
//     Used to access the value of TOptions for the lifetime of a request.
//
// 類(lèi)型參數(shù):
//   TOptions:
//     Options type.
public interface IOptionsSnapshot<out TOptions> : IOptions<TOptions> where TOptions : class, new()
{
    //
    // 摘要:
    //     Returns a configured TOptions instance with the given name.
    TOptions Get(string name);
}

從字面上理解,IOptionsMonitor 建議在配置信息更改后需要通知的場(chǎng)景下使用,所以多了個(gè) OnChange 的方法;而 IOptionsSnapshot 翻譯過(guò)來(lái)的意思是:用于在請(qǐng)求的生命周期內(nèi)訪(fǎng)問(wèn)配置,有點(diǎn)難以理解哈,我們接下來(lái)用代碼來(lái)驗(yàn)證一下。

IOptionsMonitor 與 IOptionsSnapshot的生命周期

我們對(duì)實(shí)體模型再做一點(diǎn)小小的修改,增加一個(gè) guid 字段,并給上默認(rèn)值:

public class UserOption
{
    public string userName { get; set; }
    public int userAge { get; set; }

    public Guid guid { get; set; } = Guid.NewGuid();
}

我們?cè)俅芜\(yùn)行程序:

father — 姓名:趙一,年齡:19,編號(hào):e0d71f47-e8f1-4a6d-875e-2074c985f4a0 
son — 姓名:趙一的崽,年齡:3,編號(hào):d865151b-f9bf-4eff-bb4e-8ab6dc61160c

然后不停的刷新頁(yè)面會(huì)發(fā)現(xiàn),father 的編號(hào)沒(méi)有發(fā)生任何編號(hào),而 son 的編號(hào)每次刷新都會(huì)改變。這是不是比較像我們注冊(cè)時(shí)所用到的三種模式:

services.AddScoped();
services.AddTransient();
services.AddSingleton()

其中 father 類(lèi)似 AddSingleton,son 則類(lèi)似 AddScopedAddTransient

大家可以在同一個(gè)方法里多次調(diào)用 childOptions.Get("son") 看看 son 到底時(shí)類(lèi)似 AddScoped 還是 AddTransient。

IOptionsMonitor的OnChange調(diào)用方式

userOptions.OnChange((user,name)=> { Console.WriteLine(user.userName +"-"+ name); });

無(wú)文件配置

無(wú)文件配置就是不需要以靜態(tài)文件的方式進(jìn)行配置。相關(guān)信息在配置一次后就不用再做修改,我們可以采用無(wú)文件配置的方式,比如我們熟悉的 AddCors 跨域配置

services.AddCors(op => {
	op.AddPolicy(CorsName, set => {
		set.SetIsOriginAllowed(origin => true).AllowAnyHeader().AllowAnyMethod().AllowCredentials();
            });
        });

我們對(duì)之前的注冊(cè)方法進(jìn)行一下改動(dòng):

services.Configure<UserOption>(c =>
{
	c.userName = "錢(qián)二";
	c.userAge = 60;
});

控制器注入采用常規(guī)的注入方式,最終輸出結(jié)果:姓名:錢(qián)二,年齡:60

分享一個(gè)源碼查看網(wǎng)站:https://source.dot.net/

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • .Net性能測(cè)試框架Crank的使用方法

    .Net性能測(cè)試框架Crank的使用方法

    這篇文章介紹了.Net性能測(cè)試框架Crank的使用方法。對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • ASP.NET 入門(mén)的五個(gè)步驟

    ASP.NET 入門(mén)的五個(gè)步驟

    ASP.NET 入門(mén)的五個(gè)步驟...
    2007-01-01
  • 那些年,我還在學(xué)習(xí)asp.net(二) 學(xué)習(xí)筆記

    那些年,我還在學(xué)習(xí)asp.net(二) 學(xué)習(xí)筆記

    那些年覺(jué)得看視頻是很輕松的了解一個(gè)東西,但是這樣的不足就是感覺(jué)太慢了,沒(méi)有看書(shū)來(lái)得快,所以在有了一些了解后,還得看點(diǎn)書(shū),也許書(shū)上的不一定好,但書(shū)上會(huì)把每一個(gè)應(yīng)該說(shuō)到的地方說(shuō)到,好有個(gè)初步的認(rèn)識(shí)
    2012-03-03
  • ASP.NET中BulletedList列表控件使用及詳解

    ASP.NET中BulletedList列表控件使用及詳解

    本文主要介紹了ASP.NET中BulletedList列表控件的詳細(xì)使用方法,講解各屬性的含義以及三種顯示模式,希望能幫到大家。
    2016-04-04
  • ASP.NET Core中間件

    ASP.NET Core中間件

    這篇文章介紹了ASP.NET Core的中間件,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • 詳解Asp.net 5中的ApplicationBuilder

    詳解Asp.net 5中的ApplicationBuilder

    這篇文章介紹了Asp.net 5中的ApplicationBuilder,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • ASP.Net?Core?MVC基礎(chǔ)系列之獲取配置信息

    ASP.Net?Core?MVC基礎(chǔ)系列之獲取配置信息

    這篇文章介紹了ASP.Net?Core?MVC獲取配置信息的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • ASP.NET Calendar日歷(日期)控件使用方法

    ASP.NET Calendar日歷(日期)控件使用方法

    本文主要介紹Calendar日歷控件的各個(gè)屬性以及舉例演示Calendar控件的具體使用方法,希望對(duì)大家有所幫助。
    2016-04-04
  • WCF入門(mén)需要掌握的基礎(chǔ)知識(shí)

    WCF入門(mén)需要掌握的基礎(chǔ)知識(shí)

    這篇文章介紹了WCF入門(mén)需要掌握的基礎(chǔ)知識(shí),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01
  • 三種方法解決ASP.NET?Core?6中的依賴(lài)項(xiàng)

    三種方法解決ASP.NET?Core?6中的依賴(lài)項(xiàng)

    這篇文章主要介紹了解決ASP.NET?Core?6依賴(lài)項(xiàng)的三種方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-11-11

最新評(píng)論

呼伦贝尔市| 漳州市| 汶川县| 西盟| 寿宁县| 治县。| 金阳县| 兰州市| 建平县| 嘉定区| 辉南县| 长治市| 昌黎县| 巴楚县| 靖边县| 兴文县| 成武县| 东阳市| 扶余县| 尼玛县| 东安县| 成安县| 普宁市| 天长市| 平乡县| 沁阳市| 大港区| 大邑县| 莆田市| 西宁市| 浠水县| 张北县| 铜陵市| 吉木乃县| 仁化县| 汤原县| 巧家县| 明光市| 德江县| 石家庄市| 邵东县|