本篇只是從應用角度來講明asp.net core的選項模式,下一篇會從源碼來分析javascript
之前咱們使用web.config/app.config時是這樣使用配置的java
var count = ConfigurationManager.AppSettings["key"];
寫["key"]操做麻煩,弱類型的還得本身轉,後來有人作了封裝web
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"); }
}
}
這時咱們在訂單業務中隨時均可以訪問這個配置,且是強類型的json
asp.net core中把這種爲小模塊定義的配置類稱爲選項模式,咱們把這個配置對象稱爲選項對象.微軟爲咱們定義了一些類,這些類相互協做完成了如下任務:
一、配置來源能夠是內存數據、xml、json、ini文件、數據庫...或其它,也要支持咱們自定義的來源
二、配置文件發生更改後配置對象自動更新
三、咱們但願本身控制配置的生命週期,好比:
我但願拿到的這個選項對象在應用程序運行期間永遠不變
我但願每次請求拿到的選項對象都是最新的,意思說每次請求你都幫我根據配置源從新建立一個選項對象
我但願首先根據源建立選項對象,而且一直緩存它,當源有變化時幫我刷新配置對象api
先作個說明:可能你有了解過asp.net core中的配置,其實選項與配置沒有必然的聯繫,由於選項模式的根本是體現爲單獨的模塊定義一個配置對象,方便訪問,至於這個配置對象的數據從哪來則不規定,你可使用任何方式,可是使用asp.net core提供的配置功能更方便也更常見而已緩存
再者選項模式跟依賴注入也沒有必然的聯繫,緣由跟上面同樣,可是asp.net core提供的選項模式是創建在依賴注入基礎上的。但又與咱們一般理解的有所不一樣。一般咱們是定義接口IA,實現類A,而後註冊iocContainer.Register<IA,A>(); 而後在使用時經過構造函數或屬性注入。因此你可能會認爲咱們爲某個模塊定義選項時須要定義一個選項類,再定義一個對應的什麼接口。其實不須要,由於asp.net core爲咱們提供了相應的泛型類,具體的看下面部分的說明來理解
下面咱們假設咱們在作一個相似網盤的功能模塊,它涉及到一些配置,容許上傳的文件後綴列表、單次上傳容許的文件的大小app
public class CloudDiskOption{ public string AllowFileTypes{ get; set; }
public int AllowSize { get; set; }
}
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
但更常見的方式是使用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();
}
這樣未來咱們須要選項對象時系統會經過配置來建立選項對象
一般咱們使用以來注入來獲取選項對象,asp.net core爲咱們提供了幾個泛型接口,我的理解的基本原則以下
網上有些文章說IOptionsMonitorCache<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了,能夠嘗試修改配置文件後觀察變化
其它兩個接口用法相似,不在敘述
從應用的角度來說選項用起來仍是很是簡單方便的,兩個步驟:1定義選項的如何賦值 2使用的地方經過相應的泛型接口注入
下一篇會從源碼來分析asp.net core選項框架原理