asp.net core 3.0 選項模式1:使用

来源:https://www.cnblogs.com/jionsoft/archive/2019/11/19/11892525.html
-Advertisement-
Play Games

本篇只是從應用角度來說明asp.net core的選項模式,下一篇會從源碼來分析 1、以前的方式 以前我們使用web.config/app.config時是這樣使用配置的 寫["key"]操作麻煩,弱類型的還得自己轉,後來有人做了封裝 稍微好了點,全能方式,系統任何地方都可以調用,但是沒有組織,最好 ...


本篇只是從應用角度來說明asp.net core的選項模式,下一篇會從源碼來分析

1、以前的方式

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

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

 

寫["key"]操作麻煩,弱類型的還得自己轉,後來有人做了封裝

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

 

稍微好了點,全能方式,系統任何地方都可以調用,但是沒有組織,最好是為單獨的模塊定義一個類,比如為訂單模塊定義一個配置類

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

這時我們在訂單業務中隨時都可以訪問這個配置,且是強類型的

 

2、asp.net core中的選項模式

asp.net core中把這種為小模塊定義的配置類稱為選項模式,我們把這個配置對象稱為選項對象.微軟為我們定義了一些類,這些類相互協作完成了以下任務:
1、配置來源可以是記憶體數據、xml、json、ini文件、資料庫...或其它,也要支持我們自定義的來源
2、配置文件發生更改後配置對象自動更新
3、我們希望自己控制配置的生命周期,比如:
  我希望拿到的這個選項對象在應用程式運行期間永遠不變
  我希望每次請求拿到的選項對象都是最新的,意思說每次請求你都幫我根據配置源重新創建一個選項對象
  我希望首先根據源創建選項對象,並且一直緩存它,當源有變化時幫我刷新配置對象


先做個說明:可能你有瞭解過asp.net core中的配置,其實選項與配置沒有必然的聯繫,因為選項模式的根本是體現為單獨的模塊定義一個配置對象,方便訪問,至於這個配置對象的數據從哪來則不規定,你可以使用任何方式,但是使用asp.net core提供的配置功能更方便也更常見而已

再者選項模式跟依賴註入也沒有必然的聯繫,原因跟上面一樣,但是asp.net core提供的選項模式是建立在依賴註入基礎上的。但又與我們通常理解的有所不同。通常我們是定義介面IA,實現類A,然後註冊iocContainer.Register<IA,A>(); 然後在使用時通過構造函數或屬性註入。所以你可能會認為我們為某個模塊定義選項時需要定義一個選項類,再定義一個對應的什麼介面。其實不需要,因為asp.net core為我們提供了相應的泛型類,具體的看下麵部分的說明來理解

下麵我們假設我們在做一個類似網盤的功能模塊,它涉及到一些配置,允許上傳的文件尾碼列表、單次上傳允許的文件的大小

2.1、定義選項類

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

 

2.2、定義選項對象如何賦值

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

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

這樣將來我們在需要使用選項類時asp.net core的選項框架會使用這個委托來幫我們創建

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

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

你會看到我故意將選項類名與這裡的配置鍵myoption設置成不一樣,且配置項的大小寫也不對應,這些屬於配置部分的內容,這裡不多講,下麵修改我們的Startup類

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

這樣將來我們需要選項對象時系統會通過配置來創建選項對象

 

2.3、使用選項對象

通常我們使用以來註入來獲取選項對象,asp.net core為我們提供了幾個泛型介面,個人理解的基本原則如下

  • 當你的選項對象基本不變時使用IOptions<TOptions> ,它會一直緩存選項對象,可以理解為單例選項對象
  • 當你希望每個請求都重讀配置以獲得新的選項對象時使用IOptionsSnapshot<TOptions>
  • 當你希望一直緩存我的選項對象,但當配置源發生更改時自動更新我的選項對象時使用IOptionsMonitor<TOptions>

網上有些文章說IOptionsMonitor<TOptions>是使用得最少的,我反而覺得它應該是最常用的
另外它有個OnChange可以註冊一個委托,就是當選項更改後你希望做啥,看情況應該小心使用,因為它可能會導致你的調用方的對象一直無法釋放,但是我想微軟不會太傻,應該有個釋放機制,目前那裡的源碼沒看太懂

下麵我們來看咋用,比如我們希望在controller中訪問選項,通過構造函數註入

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)=>
            { 
                //危險
            });
            this.myOption = optionsMonitor.CurrentValue;
        }

這是你的controller對象的其他action就可以隨便訪問myOption了,可以嘗試修改配置文件後觀察變化
其它兩個介面用法類似,不在敘述

3、總結

 從應用的角度來講選項用起來還是非常簡單方便的,兩個步驟:1定義選項的如何賦值 2使用的地方通過相應的泛型介面註入
下一篇會從源碼來分析asp.net core選項框架原理


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 定義(以下是百度百科中的定義): Java介面:Java介面是一系列方法的聲明,是一些方法特征的集合,一個介面只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具有不同的行為(功能)。 個人補充:Java介面中也可以有屬性,只不過必須為 靜態常量(由public ...
  • 背景 1. 硬體的極速發展,多核心CPU司空見慣;分散式的軟體架構司空見慣; 2. 功能API大多採用混聚的方式把基礎服務的內容鏈接在一起,方便用戶生活。 拋出了兩個問題: 1. 如何發揮多核能力; 2. 切分大型任務,讓每個子任務並行運行; 併發和並行的區別 |項目|區別1|實現技術| | | | ...
  • 十大經典排序演算法 為了方便大家查找,我這裡弄一個偽目錄。 選擇排序 插入排序 冒泡排序 非優化版本 優化版本 希爾排序 歸併排序 遞歸式歸併排序 非遞歸式歸併排序 快速排序 堆排序 基數排序 非優化版本 優化版本 桶排序 基數排序 java編寫較好鏈接https://www.cnblogs.com/ ...
  • 28.模塊當腳本執行 !!!! 註意 這是分兩個文件的 一個是student.py和app3.py student.py name = "Song Ke" name_list = ["張三", "李四", "王五"] def who_am_i(myName): print(f'my name is ...
  • MATLAB實例:求相關係數、繪製熱圖並找到強相關對 作者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/ 用MATLAB編程,求給定數據不同維度之間的相關係數,並繪製熱圖,保存圖片,找到強相關的維度對。 數據集來自UCI中的wine:https://arc ...
  • 來源:濟南小老虎 .NET Core是一個開源通用的開發框架,具有跨平臺能力,我們在享受其性能飆升的同時,也面臨了一些問題。通過觀察 NetCore 程式的線上運行情況發現 ,負載高的情況下應用程式占用記憶體較大,本文將針對這個問題展開討論,對比分析不同GC工作模式下的.NetCore性能與記憶體管理的 ...
  • 一、Asp.net Core基礎 微軟中文官網:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/ 微軟英文官網:https://docs.microsoft.com/en-us/aspnet/core/ .NET Core:h ...
  • 如下圖,如何判斷幾何多邊形A被多邊形B,切割為多段幾何? 幾何A被幾何B切割 1. 獲取幾何A與幾何B的交集C var intersectGeometry = new CombinedGeometry(GeometryCombineMode.Intersect, geometry1, geometr ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...