小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

asp.net core 3.0 選項(xiàng)模式1:使用

 行者花雕 2020-05-07

本篇只是從應(yīng)用角度來說明asp.net core的選項(xiàng)模式,下一篇會(huì)從源碼來分析

1、以前的方式

以前我們使用web.config/app.config時(shí)是這樣使用配置的

var count = ConfigurationManager.AppSettings["key"];

 

寫["key"]操作麻煩,弱類型的還得自己轉(zhuǎn),后來有人做了封裝

public static class ConfigHelper{
  public static T Get<T>(string key){
    return (T)ConfigurationManager.AppSettings[key];
  }
}

 

稍微好了點(diǎn),全能方式,系統(tǒng)任何地方都可以調(diào)用,但是沒有組織,最好是為單獨(dú)的模塊定義一個(gè)類,比如為訂單模塊定義一個(gè)配置類

public static class OrderConfig{
  public static int Opt1{
    get{ return ConfigHelper.Get<int>("opt1"); }
  }
}

這時(shí)我們在訂單業(yè)務(wù)中隨時(shí)都可以訪問這個(gè)配置,且是強(qiáng)類型的

 

2、asp.net core中的選項(xiàng)模式

asp.net core中把這種為小模塊定義的配置類稱為選項(xiàng)模式,我們把這個(gè)配置對(duì)象稱為選項(xiàng)對(duì)象.微軟為我們定義了一些類,這些類相互協(xié)作完成了以下任務(wù):
1、配置來源可以是內(nèi)存數(shù)據(jù)、xml、json、ini文件、數(shù)據(jù)庫...或其它,也要支持我們自定義的來源
2、配置文件發(fā)生更改后配置對(duì)象自動(dòng)更新
3、我們希望自己控制配置的生命周期,比如:
  我希望拿到的這個(gè)選項(xiàng)對(duì)象在應(yīng)用程序運(yùn)行期間永遠(yuǎn)不變
  我希望每次請(qǐng)求拿到的選項(xiàng)對(duì)象都是最新的,意思說每次請(qǐng)求你都幫我根據(jù)配置源重新創(chuàng)建一個(gè)選項(xiàng)對(duì)象
  我希望首先根據(jù)源創(chuàng)建選項(xiàng)對(duì)象,并且一直緩存它,當(dāng)源有變化時(shí)幫我刷新配置對(duì)象


先做個(gè)說明:可能你有了解過asp.net core中的配置,其實(shí)選項(xiàng)與配置沒有必然的聯(lián)系,因?yàn)?span style="color: #ff0000;">選項(xiàng)模式的根本是體現(xiàn)為單獨(dú)的模塊定義一個(gè)配置對(duì)象,方便訪問,至于這個(gè)配置對(duì)象的數(shù)據(jù)從哪來則不規(guī)定,你可以使用任何方式,但是使用asp.net core提供的配置功能更方便也更常見而已

再者選項(xiàng)模式跟依賴注入也沒有必然的聯(lián)系,原因跟上面一樣,但是asp.net core提供的選項(xiàng)模式是建立在依賴注入基礎(chǔ)上的。但又與我們通常理解的有所不同。通常我們是定義接口IA,實(shí)現(xiàn)類A,然后注冊iocContainer.Register<IA,A>(); 然后在使用時(shí)通過構(gòu)造函數(shù)或?qū)傩宰⑷?。所以你可能?huì)認(rèn)為我們?yōu)槟硞€(gè)模塊定義選項(xiàng)時(shí)需要定義一個(gè)選項(xiàng)類,再定義一個(gè)對(duì)應(yīng)的什么接口。其實(shí)不需要,因?yàn)閍sp.net core為我們提供了相應(yīng)的泛型類,具體的看下面部分的說明來理解

下面我們假設(shè)我們在做一個(gè)類似網(wǎng)盤的功能模塊,它涉及到一些配置,允許上傳的文件后綴列表、單次上傳允許的文件的大小

2.1、定義選項(xiàng)類

public class CloudDiskOption{
  public string AllowFileTypes{ get; set; }
  public int AllowSize { get; set; }
}

 

2.2、定義選項(xiàng)對(duì)象如何賦值

asp.net core允許我們自己來定義選項(xiàng)對(duì)象如何賦值,最簡單的方式是使用委托,代碼如下

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CloudDiskOption>(c=> {
         c.AllowSize = 1024;
         c.AllowFileTypes = "jpg,zip,pdf,docx";
     });
     services.AddControllersWithViews();
}

這樣將來我們在需要使用選項(xiàng)類時(shí)asp.net core的選項(xiàng)框架會(huì)使用這個(gè)委托來幫我們創(chuàng)建

但更常見的方式是使用asp.net core提供的配置
西安在appsettings.json中做如下配置:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "myoption": {
    "allowFileTypes": "jpg,zip,pdf,docx",
    "allowSize": "1024"
  }
}

你會(huì)看到我故意將選項(xiàng)類名與這里的配置鍵myoption設(shè)置成不一樣,且配置項(xiàng)的大小寫也不對(duì)應(yīng),這些屬于配置部分的內(nèi)容,這里不多講,下面修改我們的Startup類

public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CloudDiskOption>(Configuration.GetSection("myoption"));
            services.AddControllersWithViews();
        }

這樣將來我們需要選項(xiàng)對(duì)象時(shí)系統(tǒng)會(huì)通過配置來創(chuàng)建選項(xiàng)對(duì)象

 

2.3、使用選項(xiàng)對(duì)象

通常我們使用以來注入來獲取選項(xiàng)對(duì)象,asp.net core為我們提供了幾個(gè)泛型接口,個(gè)人理解的基本原則如下

  • 當(dāng)你的選項(xiàng)對(duì)象基本不變時(shí)使用IOptions<TOptions> ,它會(huì)一直緩存選項(xiàng)對(duì)象,可以理解為單例選項(xiàng)對(duì)象
  • 當(dāng)你希望每個(gè)請(qǐng)求都重讀配置以獲得新的選項(xiàng)對(duì)象時(shí)使用IOptionsSnapshot<TOptions>
  • 當(dāng)你希望一直緩存我的選項(xiàng)對(duì)象,但當(dāng)配置源發(fā)生更改時(shí)自動(dòng)更新我的選項(xiàng)對(duì)象時(shí)使用IOptionsMonitor<TOptions>

網(wǎng)上有些文章說IOptionsMonitor<TOptions>是使用得最少的,我反而覺得它應(yīng)該是最常用的
另外它有個(gè)OnChange可以注冊一個(gè)委托,就是當(dāng)選項(xiàng)更改后你希望做啥,看情況應(yīng)該小心使用,因?yàn)樗赡軙?huì)導(dǎo)致你的調(diào)用方的對(duì)象一直無法釋放,但是我想微軟不會(huì)太傻,應(yīng)該有個(gè)釋放機(jī)制,目前那里的源碼沒看太懂

下面我們來看咋用,比如我們希望在controller中訪問選項(xiàng),通過構(gòu)造函數(shù)注入

public class HomeController : Controller
{
        private readonly ILogger<HomeController> _logger;
        CloudDiskOption myOption;
        public HomeController(ILogger<HomeController> logger, IOptionsMonitor<CloudDiskOption> optionsMonitor)
        {
            _logger = logger;
            optionsMonitor.OnChange((a,b)=>
            { 
                //危險(xiǎn)
            });
            this.myOption = optionsMonitor.CurrentValue;
        }

這是你的controller對(duì)象的其他action就可以隨便訪問myOption了,可以嘗試修改配置文件后觀察變化
其它兩個(gè)接口用法類似,不在敘述

3、總結(jié)

 從應(yīng)用的角度來講選項(xiàng)用起來還是非常簡單方便的,兩個(gè)步驟:1定義選項(xiàng)的如何賦值 2使用的地方通過相應(yīng)的泛型接口注入
下一篇會(huì)從源碼來分析asp.net core選項(xiàng)框架原理

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多