99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

ASP.NET Core 中的選項(xiàng)模式

2019-04-17 08:58 更新

選項(xiàng)模式使用類來表示相關(guān)設(shè)置的組。 當(dāng)配置設(shè)置由方案隔離到單獨(dú)的類時(shí),應(yīng)用遵循兩個(gè)重要軟件工程原則:

選項(xiàng)還提供驗(yàn)證配置數(shù)據(jù)的機(jī)制。 有關(guān)詳細(xì)信息,請(qǐng)參閱選項(xiàng)驗(yàn)證部分。

查看或下載示例代碼如何下載

系統(tǒng)必備

引用 Microsoft.AspNetCore.App 元包或?qū)锰砑拥?nbsp;Microsoft.Extensions.Options.ConfigurationExtensions 包。

選項(xiàng)接口

IOptionsMonitor<TOptions> 用于檢索選項(xiàng)并管理 TOptions 實(shí)例的選項(xiàng)通知。IOptionsMonitor<TOptions> 支持以下方案:

后期配置方案允許你在進(jìn)行所有 IConfigureOptions<TOptions> 配置后設(shè)置或更改選項(xiàng)。

IOptionsFactory<TOptions> 負(fù)責(zé)新建選項(xiàng)實(shí)例。 它具有單個(gè) Create 方法。 默認(rèn)實(shí)現(xiàn)采用所有已注冊(cè) IConfigureOptions<TOptions> 和 IPostConfigureOptions<TOptions> 并首先運(yùn)行所有配置,然后才進(jìn)行后期配置。 它區(qū)分 IConfigureNamedOptions<TOptions> 和 IConfigureOptions<TOptions>且僅調(diào)用適當(dāng)?shù)慕涌凇?/p>

IOptionsMonitorCache<TOptions> 由 IOptionsMonitor<TOptions> 用于緩存 TOptions 實(shí)例。IOptionsMonitorCache<TOptions> 可使監(jiān)視器中的選項(xiàng)實(shí)例無效,以便重新計(jì)算值 (TryRemove)。可以通過 TryAdd 手動(dòng)引入值。 在應(yīng)按需重新創(chuàng)建所有命名實(shí)例時(shí)使用 Clear 方法。

IOptionsSnapshot<TOptions> 在每次請(qǐng)求時(shí)應(yīng)重新計(jì)算選項(xiàng)的方案中有用。 有關(guān)詳細(xì)信息,請(qǐng)參閱通過 IOptionsSnapshot 重新加載配置數(shù)據(jù)部分。

IOptions<TOptions> 可用于支持選項(xiàng)。 但是,IOptions<TOptions> 不支持前面的 IOptionsMonitor<TOptions> 方案。 你可以在已使用 IOptions<TOptions> 接口的現(xiàn)有框架和庫中繼續(xù)使用 IOptions<TOptions>,并且不需要 IOptionsMonitor<TOptions> 提供的方案。

常規(guī)選項(xiàng)配置

常規(guī)選項(xiàng)配置已作為示例 #1 在示例應(yīng)用中進(jìn)行了演示。

選項(xiàng)類必須為包含公共無參數(shù)構(gòu)造函數(shù)的非抽象類。 以下類 MyOptions 具有兩種屬性:Option1 和 Option2。 設(shè)置默認(rèn)值為可選,但以下示例中的類構(gòu)造函數(shù)設(shè)置了 Option1 的默認(rèn)值。 Option2具有通過直接初始化屬性設(shè)置的默認(rèn)值 (Models/MyOptions.cs):

C#

public class MyOptions
{
    public MyOptions()
    {
        // Set default value.
        Option1 = "value1_from_ctor";
    }
    
    public string Option1 { get; set; }
    public int Option2 { get; set; } = 5;
}

MyOptions 類已通過 Configure 添加到服務(wù)容器并綁定到配置:

C#

// Example #1: General configuration
// Register the Configuration instance which MyOptions binds against.
services.Configure<MyOptions>(Configuration);

以下頁面模型通過 IOptionsMonitor<TOptions> 使用構(gòu)造函數(shù)依賴關(guān)系注入來訪問設(shè)置 (Pages/Index.cshtml.cs):

C#

private readonly MyOptions _options;

C#

public IndexModel(
    IOptionsMonitor<MyOptions> optionsAccessor, 
    IOptionsMonitor<MyOptionsWithDelegateConfig> optionsAccessorWithDelegateConfig, 
    IOptionsMonitor<MySubOptions> subOptionsAccessor, 
    IOptionsSnapshot<MyOptions> snapshotOptionsAccessor, 
    IOptionsSnapshot<MyOptions> namedOptionsAccessor)
{
    _options = optionsAccessor.CurrentValue;
    _optionsWithDelegateConfig = optionsAccessorWithDelegateConfig.CurrentValue;
    _subOptions = subOptionsAccessor.CurrentValue;
    _snapshotOptions = snapshotOptionsAccessor.Value;
    _named_options_1 = namedOptionsAccessor.Get("named_options_1");
    _named_options_2 = namedOptionsAccessor.Get("named_options_2");
}

C#

// Example #1: Simple options
var option1 = _options.Option1;
var option2 = _options.Option2;
SimpleOptions = $"option1 = {option1}, option2 = {option2}";

示例的 appsettings.json 文件指定 option1 和 option2 的值:

JSON

{
  "option1": "value1_from_json",
  "option2": -1,
  "subsection": {
    "suboption1": "subvalue1_from_json",
    "suboption2": 200
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

運(yùn)行應(yīng)用時(shí),頁面模型的 OnGet 方法返回顯示選項(xiàng)類值的字符串:

HTML

option1 = value1_from_json, option2 = -1

 備注

使用自定義 ConfigurationBuilder 從設(shè)置文件加載選項(xiàng)配置時(shí),請(qǐng)確認(rèn)基路徑設(shè)置正確:

C#

var configBuilder = new ConfigurationBuilder()
   .SetBasePath(Directory.GetCurrentDirectory())
   .AddJsonFile("appsettings.json", optional: true);
var config = configBuilder.Build();

services.Configure<MyOptions>(config);

通過 CreateDefaultBuilder 從設(shè)置文件加載選項(xiàng)配置時(shí),不需要顯式設(shè)置基路徑。

通過委托配置簡單選項(xiàng)

通過委托配置簡單選項(xiàng)已作為示例 #2 在示例應(yīng)用中進(jìn)行了演示。

使用委托設(shè)置選項(xiàng)值。 此示例應(yīng)用使用 MyOptionsWithDelegateConfig 類 (Models/MyOptionsWithDelegateConfig.cs):

C#

public class MyOptionsWithDelegateConfig
{
    public MyOptionsWithDelegateConfig()
    {
        // Set default value.
        Option1 = "value1_from_ctor";
    }
    
    public string Option1 { get; set; }
    public int Option2 { get; set; } = 5;
}

在以下代碼中,已向服務(wù)容器添加第二個(gè) IConfigureOptions<TOptions> 服務(wù)。 它通過 MyOptionsWithDelegateConfig 使用委托來配置綁定:

C#

// Example #2: Options bound and configured by a delegate
services.Configure<MyOptionsWithDelegateConfig>(myOptions =>
{
    myOptions.Option1 = "value1_configured_by_delegate";
    myOptions.Option2 = 500;
});

Index.cshtml.cs:

C#

private readonly MyOptionsWithDelegateConfig _optionsWithDelegateConfig;

C#

public IndexModel(
    IOptionsMonitor<MyOptions> optionsAccessor, 
    IOptionsMonitor<MyOptionsWithDelegateConfig> optionsAccessorWithDelegateConfig, 
    IOptionsMonitor<MySubOptions> subOptionsAccessor, 
    IOptionsSnapshot<MyOptions> snapshotOptionsAccessor, 
    IOptionsSnapshot<MyOptions> namedOptionsAccessor)
{
    _options = optionsAccessor.CurrentValue;
    _optionsWithDelegateConfig = optionsAccessorWithDelegateConfig.CurrentValue;
    _subOptions = subOptionsAccessor.CurrentValue;
    _snapshotOptions = snapshotOptionsAccessor.Value;
    _named_options_1 = namedOptionsAccessor.Get("named_options_1");
    _named_options_2 = namedOptionsAccessor.Get("named_options_2");
}

C#

// Example #2: Options configured by delegate
var delegate_config_option1 = _optionsWithDelegateConfig.Option1;
var delegate_config_option2 = _optionsWithDelegateConfig.Option2;
SimpleOptionsWithDelegateConfig = 
    $"delegate_option1 = {delegate_config_option1}, " +
    $"delegate_option2 = {delegate_config_option2}";

可添加多個(gè)配置提供程序。 配置提供程序可從 NuGet 包中獲取,并按照注冊(cè)的順序應(yīng)用。 有關(guān)更多信息,請(qǐng)參見ASP.NET Core 中的配置。

每次調(diào)用 Configure 都會(huì)將 IConfigureOptions<TOptions> 服務(wù)添加到服務(wù)容器。 在前面的示例中,Option1 和 Option2 的值同時(shí)在 appsettings.json 中指定,但 Option1 和 Option2 的值被配置的委托替代。

當(dāng)啟用多個(gè)配置服務(wù)時(shí),指定的最后一個(gè)配置源優(yōu)于其他源,由其設(shè)置配置值。 運(yùn)行應(yīng)用時(shí),頁面模型的 OnGet 方法返回顯示選項(xiàng)類值的字符串:

HTML

delegate_option1 = value1_configured_by_delegate, delegate_option2 = 500

子選項(xiàng)配置

子選項(xiàng)配置已作為示例 #3 在示例應(yīng)用中進(jìn)行了演示。

應(yīng)用應(yīng)創(chuàng)建適用于應(yīng)用中特定方案組(類)的選項(xiàng)類。 需要配置值的部分應(yīng)用應(yīng)僅有權(quán)訪問其使用的配置值。

將選項(xiàng)綁定到配置時(shí),選項(xiàng)類型中的每個(gè)屬性都將綁定到窗體 property[:sub-property:] 的配置鍵。例如,MyOptions.Option1 屬性將綁定到從 appsettings.json 中的 option1 屬性讀取的鍵 Option1。

在以下代碼中,已向服務(wù)容器添加第三個(gè) IConfigureOptions<TOptions> 服務(wù)。 它將 MySubOptions綁定到 appsettings.json 文件的 subsection 部分:

C#

// Example #3: Suboptions
// Bind options using a sub-section of the appsettings.json file.
services.Configure<MySubOptions>(Configuration.GetSection("subsection"));

GetSection 擴(kuò)展方法需要 Microsoft.Extensions.Options.ConfigurationExtensions NuGet 包。 如果應(yīng)用使用 Microsoft.AspNetCore.App metapackage 元包(ASP.NET Core 2.1 或更高版本),將自動(dòng)包含此包。

示例的 appsettings.json 文件定義具有 suboption1 和 suboption2 的鍵的 subsection 成員:

JSON

{
  "option1": "value1_from_json",
  "option2": -1,
  "subsection": {
    "suboption1": "subvalue1_from_json",
    "suboption2": 200
  },
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*"
}

MySubOptions 類將屬性 SubOption1 和 SubOption2 定義為保留選項(xiàng)值 (Models/MySubOptions.cs):

C#

public class MySubOptions
{
    public MySubOptions()
    {
        // Set default values.
        SubOption1 = "value1_from_ctor";
        SubOption2 = 5;
    }
    
    public string SubOption1 { get; set; }
    public int SubOption2 { get; set; }
}

頁面模型的 OnGet 方法返回包含選項(xiàng)值的字符串 (Pages/Index.cshtml.cs):

C#

private readonly MySubOptions _subOptions;

C#

public IndexModel(
    IOptionsMonitor<MyOptions> optionsAccessor, 
    IOptionsMonitor<MyOptionsWithDelegateConfig> optionsAccessorWithDelegateConfig, 
    IOptionsMonitor<MySubOptions> subOptionsAccessor, 
    IOptionsSnapshot<MyOptions> snapshotOptionsAccessor, 
    IOptionsSnapshot<MyOptions> namedOptionsAccessor)
{
    _options = optionsAccessor.CurrentValue;
    _optionsWithDelegateConfig = optionsAccessorWithDelegateConfig.CurrentValue;
    _subOptions = subOptionsAccessor.CurrentValue;
    _snapshotOptions = snapshotOptionsAccessor.Value;
    _named_options_1 = namedOptionsAccessor.Get("named_options_1");
    _named_options_2 = namedOptionsAccessor.Get("named_options_2");
}

C#

// Example #3: Suboptions
var subOption1 = _subOptions.SubOption1;
var subOption2 = _subOptions.SubOption2;
SubOptions = $"subOption1 = {subOption1}, subOption2 = {subOption2}";

運(yùn)行應(yīng)用時(shí),OnGet 方法返回顯示子選項(xiàng)類值的字符串:

HTML

subOption1 = subvalue1_from_json, subOption2 = 200

視圖模型或通過直接視圖注入提供的選項(xiàng)

視圖模型或通過直接視圖注入提供的選項(xiàng)已作為示例 #4 在示例應(yīng)用中進(jìn)行了演示。

可在視圖模型中或通過將 IOptionsMonitor<TOptions> 直接注入到視圖 (Pages/Index.cshtml.cs) 來提供選項(xiàng):

C#

private readonly MyOptions _options;

C#

public IndexModel(
    IOptionsMonitor<MyOptions> optionsAccessor, 
    IOptionsMonitor<MyOptionsWithDelegateConfig> optionsAccessorWithDelegateConfig, 
    IOptionsMonitor<MySubOptions> subOptionsAccessor, 
    IOptionsSnapshot<MyOptions> snapshotOptionsAccessor, 
    IOptionsSnapshot<MyOptions> namedOptionsAccessor)
{
    _options = optionsAccessor.CurrentValue;
    _optionsWithDelegateConfig = optionsAccessorWithDelegateConfig.CurrentValue;
    _subOptions = subOptionsAccessor.CurrentValue;
    _snapshotOptions = snapshotOptionsAccessor.Value;
    _named_options_1 = namedOptionsAccessor.Get("named_options_1");
    _named_options_2 = namedOptionsAccessor.Get("named_options_2");
}

C#

// Example #4: Bind options directly to the page
MyOptions = _options;

示例應(yīng)用演示如何使用 @inject 指令注入 IOptionsMonitor<MyOptions>:

CSHTML

@page
@model IndexModel
@using Microsoft.Extensions.Options
@inject IOptionsMonitor<MyOptions> OptionsAccessor
@{
    ViewData["Title"] = "Options Sample";
}

<h1>@ViewData["Title"]</h1>

當(dāng)應(yīng)用運(yùn)行時(shí),選項(xiàng)值顯示在呈現(xiàn)的頁面中:

選項(xiàng)值 Option1:value1_from_json 和 Option2:-1 從模型中加載并注入視圖。

通過 IOptionsSnapshot 重新加載配置數(shù)據(jù)

通過 IOptionsSnapshot<TOptions> 重新加載配置數(shù)據(jù)已作為示例 #5 在示例應(yīng)用中進(jìn)行了演示。

IOptionsSnapshot<TOptions> 支持包含最小處理開銷的重新加載選項(xiàng)。

針對(duì)請(qǐng)求生存期訪問和緩存選項(xiàng)時(shí),每個(gè)請(qǐng)求只能計(jì)算一次選項(xiàng)。

以下示例演示如何在更改 appsettings.json (Pages/Index.cshtml.cs) 后創(chuàng)建新的 IOptionsSnapshot<TOptions>。 在更改文件和重新加載配置之前,針對(duì)服務(wù)器的多個(gè)請(qǐng)求返回 appsettings.json 文件提供的常數(shù)值。

C#

private readonly MyOptions _snapshotOptions;

C#

public IndexModel(
    IOptionsMonitor<MyOptions> optionsAccessor, 
    IOptionsMonitor<MyOptionsWithDelegateConfig> optionsAccessorWithDelegateConfig, 
    IOptionsMonitor<MySubOptions> subOptionsAccessor, 
    IOptionsSnapshot<MyOptions> snapshotOptionsAccessor, 
    IOptionsSnapshot<MyOptions> namedOptionsAccessor)
{
    _options = optionsAccessor.CurrentValue;
    _optionsWithDelegateConfig = optionsAccessorWithDelegateConfig.CurrentValue;
    _subOptions = subOptionsAccessor.CurrentValue;
    _snapshotOptions = snapshotOptionsAccessor.Value;
    _named_options_1 = namedOptionsAccessor.Get("named_options_1");
    _named_options_2 = namedOptionsAccessor.Get("named_options_2");
}

C#

// Example #5: Snapshot options
var snapshotOption1 = _snapshotOptions.Option1;
var snapshotOption2 = _snapshotOptions.Option2;
SnapshotOptions = 
    $"snapshot option1 = {snapshotOption1}, " +
    $"snapshot option2 = {snapshotOption2}";

下圖顯示從 appsettings.json 文件加載的初始 option1 和 option2 值:

HTML

snapshot option1 = value1_from_json, snapshot option2 = -1

將 appsettings.json 文件中的值更改為 value1_from_json UPDATED 和 200。 保存 appsettings.json 文件。 刷新瀏覽器,查看更新的選項(xiàng)值:

HTML

snapshot option1 = value1_from_json UPDATED, snapshot option2 = 200

包含 IConfigureNamedOptions 的命名選項(xiàng)支持

包含 IConfigureNamedOptions<TOptions> 的命名選項(xiàng)支持已作為示例 #6 在示例應(yīng)用中進(jìn)行了演示。

命名選項(xiàng)支持允許應(yīng)用在命名選項(xiàng)配置之間進(jìn)行區(qū)分。 在示例應(yīng)用中,命名選項(xiàng)通過 OptionsServiceCollectionExtensions.Configure 進(jìn)行聲明,其調(diào)用擴(kuò)展方法 ConfigureNamedOptions<TOptions>.Configure

C#

// Example #6: Named options (named_options_1)
// Register the ConfigurationBuilder instance which MyOptions binds against.
// Specify that the options loaded from configuration are named
// "named_options_1".
services.Configure<MyOptions>("named_options_1", Configuration);

// Example #6: Named options (named_options_2)
// Specify that the options loaded from the MyOptions class are named
// "named_options_2".
// Use a delegate to configure option values.
services.Configure<MyOptions>("named_options_2", myOptions =>
{
    myOptions.Option1 = "named_options_2_value1_from_action";
});

示例應(yīng)用通過 Get (Pages/Index.cshtml.cs) 訪問命名選項(xiàng):

C#

private readonly MyOptions _named_options_1;
private readonly MyOptions _named_options_2;

C#

public IndexModel(
    IOptionsMonitor<MyOptions> optionsAccessor, 
    IOptionsMonitor<MyOptionsWithDelegateConfig> optionsAccessorWithDelegateConfig, 
    IOptionsMonitor<MySubOptions> subOptionsAccessor, 
    IOptionsSnapshot<MyOptions> snapshotOptionsAccessor, 
    IOptionsSnapshot<MyOptions> namedOptionsAccessor)
{
    _options = optionsAccessor.CurrentValue;
    _optionsWithDelegateConfig = optionsAccessorWithDelegateConfig.CurrentValue;
    _subOptions = subOptionsAccessor.CurrentValue;
    _snapshotOptions = snapshotOptionsAccessor.Value;
    _named_options_1 = namedOptionsAccessor.Get("named_options_1");
    _named_options_2 = namedOptionsAccessor.Get("named_options_2");
}

C#

// Example #6: Named options
var named_options_1 = 
    $"named_options_1: option1 = {_named_options_1.Option1}, " +
    $"option2 = {_named_options_1.Option2}";
var named_options_2 = 
    $"named_options_2: option1 = {_named_options_2.Option1}, " +
    $"option2 = {_named_options_2.Option2}";
NamedOptions = $"{named_options_1} {named_options_2}";

運(yùn)行示例應(yīng)用,將返回命名選項(xiàng):

HTML

named_options_1: option1 = value1_from_json, option2 = -1
named_options_2: option1 = named_options_2_value1_from_action, option2 = 5

從配置中提供從 appsettings.json 文件中加載的 named_options_1 值。 通過以下內(nèi)容提供 named_options_2 值:

  • 針對(duì) Option1 的 ConfigureServices 中的 named_options_2 委托。
  • MyOptions 類提供的 Option2 的默認(rèn)值。

使用 ConfigureAll 方法配置所有選項(xiàng)

使用 ConfigureAll 方法配置所有選項(xiàng)實(shí)例。 以下代碼將針對(duì)包含公共值的所有配置實(shí)例配置 Option1。 將以下代碼手動(dòng)添加到 Startup.ConfigureServices 方法:

C#

services.ConfigureAll<MyOptions>(myOptions => 
{
    myOptions.Option1 = "ConfigureAll replacement value";
});

添加代碼后運(yùn)行示例應(yīng)用將產(chǎn)生以下結(jié)果:

HTML

named_options_1: option1 = ConfigureAll replacement value, option2 = -1
named_options_2: option1 = ConfigureAll replacement value, option2 = 5

 備注

所有選項(xiàng)都是命名實(shí)例。 現(xiàn)有 IConfigureOptions<TOptions> 實(shí)例將被視為面向?yàn)?nbsp;string.Empty 的 Options.DefaultName 實(shí)例。 IConfigureNamedOptions<TOptions> 還可實(shí)現(xiàn) IConfigureOptions<TOptions>。 IOptionsFactory<TOptions> 的默認(rèn)實(shí)現(xiàn)具有適當(dāng)?shù)厥褂妹總€(gè)實(shí)例的邏輯。 null 命名選項(xiàng)用于面向所有命名實(shí)例而不是某一特定命名實(shí)例(ConfigureAll 和 PostConfigureAll 使用此約定)。

OptionsBuilder API

OptionsBuilder<TOptions> 用于配置 TOptions 實(shí)例。 OptionsBuilder 簡化了創(chuàng)建命名選項(xiàng)的過程,因?yàn)樗皇浅跏?nbsp;AddOptions<TOptions>(string optionsName) 調(diào)用的單個(gè)參數(shù),而不會(huì)出現(xiàn)在所有后續(xù)調(diào)用中。 選項(xiàng)驗(yàn)證和接受服務(wù)依賴關(guān)系的 ConfigureOptions 重載僅可通過 OptionsBuilder 獲得。

C#

// Options.DefaultName = "" is used.
services.AddOptions<MyOptions>().Configure(o => o.Property = "default");

services.AddOptions<MyOptions>("optionalName")
    .Configure(o => o.Property = "named");

使用 DI 服務(wù)配置選項(xiàng)

在配置選項(xiàng)時(shí),可以通過以下兩種方式通過依賴關(guān)系注入訪問其他服務(wù):

建議將配置委托傳遞給 Configure,因?yàn)閯?chuàng)建服務(wù)較復(fù)雜。 在使用 Configure時(shí),創(chuàng)建你自己的類型等效于框架為你執(zhí)行的操作。 調(diào)用 Configure 會(huì)注冊(cè)臨時(shí)泛型 IConfigureNamedOptions<TOptions>,它具有接受指定的泛型服務(wù)類型的構(gòu)造函數(shù)。

選項(xiàng)驗(yàn)證

借助選項(xiàng)驗(yàn)證,可以驗(yàn)證已配置的選項(xiàng)。 使用驗(yàn)證方法調(diào)用 Validate。如果選項(xiàng)有效,方法返回 true;如果無效,方法返回 false:

C#

// Registration
services.AddOptions<MyOptions>("optionalOptionsName")
    .Configure(o => { }) // Configure the options
    .Validate(o => YourValidationShouldReturnTrueIfValid(o), 
        "custom error");

// Consumption
var monitor = services.BuildServiceProvider()
    .GetService<IOptionsMonitor<MyOptions>>();

try
{
    var options = monitor.Get("optionalOptionsName");
}
catch (OptionsValidationException e) 
{
   // e.OptionsName returns "optionalOptionsName"
   // e.OptionsType returns typeof(MyOptions)
   // e.Failures returns a list of errors, which would contain 
   //     "custom error"
}

上面的示例將命名選項(xiàng)實(shí)例設(shè)置為 optionalOptionsName。 默認(rèn)選項(xiàng)實(shí)例為 Options.DefaultName。

選項(xiàng)驗(yàn)證在選項(xiàng)實(shí)例創(chuàng)建后運(yùn)行。 系統(tǒng)保證在選項(xiàng)實(shí)例首次獲得訪問時(shí)通過驗(yàn)證。

 重要

選項(xiàng)驗(yàn)證無法防止在最初配置和驗(yàn)證選項(xiàng)后發(fā)生選項(xiàng)修改。

Validate 方法接受 Func<TOptions, bool>。 若要完全自定義驗(yàn)證,請(qǐng)實(shí)現(xiàn) IValidateOptions<TOptions>,它支持:

  • 驗(yàn)證多種類型的選項(xiàng):class ValidateTwo : IValidateOptions<Option1>, IValidationOptions<Option2>
  • 驗(yàn)證取決于其他選項(xiàng)類型:public DependsOnAnotherOptionValidator(IOptionsMonitor<AnotherOption> options)

IValidateOptions 驗(yàn)證:

  • 特定的命名選項(xiàng)實(shí)例。
  • 所有選項(xiàng)(如果 name 為 null 的話)。

通過接口實(shí)現(xiàn)返回 ValidateOptionsResult:

C#

public interface IValidateOptions<TOptions> where TOptions : class
{
    ValidateOptionsResult Validate(string name, TOptions options);
}

通過調(diào)用 OptionsBuilder<TOptions> 上的 ValidateDataAnnotations 方法,可以從 Microsoft.Extensions.Options.DataAnnotations 包中獲得基于數(shù)據(jù)注釋的驗(yàn)證。Microsoft.AspNetCore.App 元包(ASP.NET Core 2.2 或更高版本)中包括 Microsoft.Extensions.Options.DataAnnotations。

C#

private class AnnotatedOptions
{
    [Required]
    public string Required { get; set; }

    [StringLength(5, ErrorMessage = "Too long.")]
    public string StringLength { get; set; }

    [Range(-5, 5, ErrorMessage = "Out of range.")]
    public int IntRange { get; set; }
}

[Fact]
public void CanValidateDataAnnotations()
{
    var services = new ServiceCollection();
    services.AddOptions<AnnotatedOptions>()
        .Configure(o =>
        {
            o.StringLength = "111111";
            o.IntRange = 10;
            o.Custom = "nowhere";
        })
        .ValidateDataAnnotations();

    var sp = services.BuildServiceProvider();

    var error = Assert.Throws<OptionsValidationException>(() => 
        sp.GetRequiredService<IOptionsMonitor<AnnotatedOptions>>().Value);
    ValidateFailure<AnnotatedOptions>(error, Options.DefaultName, 1,
        "DataAnnotation validation failed for members Required " +
            "with the error 'The Required field is required.'.",
        "DataAnnotation validation failed for members StringLength " +
            "with the error 'Too long.'.",
        "DataAnnotation validation failed for members IntRange " +
            "with the error 'Out of range.'.");
}

設(shè)計(jì)團(tuán)隊(duì)正在考慮為未來版本提供預(yù)先驗(yàn)證(在啟動(dòng)時(shí)快速失?。?。

選項(xiàng)后期配置

使用 IPostConfigureOptions<TOptions> 設(shè)置后期配置。 進(jìn)行所有 IConfigureOptions<TOptions> 配置后運(yùn)行后期配置:

C#

services.PostConfigure<MyOptions>(myOptions =>
{
    myOptions.Option1 = "post_configured_option1_value";
});

PostConfigure 可用于對(duì)命名選項(xiàng)進(jìn)行后期配置:

C#

services.PostConfigure<MyOptions>("named_options_1", myOptions =>
{
    myOptions.Option1 = "post_configured_option1_value";
});

使用 PostConfigureAll 對(duì)所有配置實(shí)例進(jìn)行后期配置:

C#

services.PostConfigureAll<MyOptions>(myOptions =>
{
    myOptions.Option1 = "post_configured_option1_value";
});

在啟動(dòng)期間訪問選項(xiàng)

IOptions<TOptions> 和 IOptionsMonitor<TOptions> 可用于 Startup.Configure 中,因?yàn)樵?nbsp;Configure 方法執(zhí)行之前已生成服務(wù)。

C#

public void Configure(IApplicationBuilder app, IOptionsMonitor<MyOptions> optionsAccessor)
{
    var option1 = optionsAccessor.CurrentValue.Option1;
}

不使用 Startup.ConfigureServices 中的 IOptions<TOptions> 或 IOptionsMonitor<TOptions>。 由于服務(wù)注冊(cè)的順序,可能存在不一致的選項(xiàng)狀態(tài)。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)