[クイックヒント]起動時にオプションパターンの検証を使用して開発者の経験を改善する.


私たちが新しいとき、またはいくつかのプロジェクトとの接触が少ないすべての設定の可能性を理解するのは難しいです.
オプションパターンは、アプリケーションに環境設定オプションを注入する最も適切な方法です.シナリオによってオプションを分離することは、重要なソフトウェア工学原則(例えば界面分離(ISP)の原則)と分離の分離の問題に付着しています.
Validateオプションは、何が定義されているのか、どのように期待されているのかを示す良い方法です.NET 5検証からの割り込みは、実行時にスローされました.
から.NET 6では、実行時ではなく起動時にオプション検証チェックを実行することができますValidatiOnStart() 拡張メソッドOptionsBuilder<TOptions> .
簡単な例を以下にValidateDataAnnotations() and ValidateOnStart() :
public static class ServiceCollectionExtensions
{
    public static OptionsBuilder<ApplicationOptions> ConfigureApplicationOptions(
        this IServiceCollection services, IConfigurationSection section)
        => services
            .AddOptions<ApplicationOptions>()
            .Bind(section)
            .ValidateDataAnnotations()
            .ValidateOnStart();
}
と起動時の使用法
services.ConfigureApplicationOptions(
    _configuration.GetSection(nameof(ApplicationOptions)));
ApplicationOptions 必須プロパティとURLの定義
public class ApplicationOptions
{
    [Required, Url]
    public string HttpClientAddress { get; init; }
}
AppSettings アドレスを目的に誤って設定する
{
  "ApplicationOptions": {
    "HttpClientAddress" : "localhost"
    }
}
次に、アプリケーションを実行すると、割り込みがエラーをスローします.
Microsoft.Extensions.Options.OptionsValidationException:
DataAnnotation validation failed for members: 'HttpClientAddress'
with the error: 'The HttpClientAddress field is not a valid
fully-qualified http, https, or ftp URL.'.
私たちが見ることができるように、エラーはかなり明確であり、問題を解決するためにどのような方法を取るかを示します.

もう一つの検証
データ注釈は、オプションを検証する唯一の方法ではありません.The Validate() メソッドはデリゲートFunc<TOptions, bool> これはどんな種類の検証戦略も許します.
このサンプルは、InlineValidator<T> 例証するには
=> services
    .AddOptions<ApplicationOptions>()
    .Bind(section)
    .Validate(options =>
        {
            var validator = new InlineValidator<ApplicationOptions>();

            validator
                .RuleFor(applicationOptions => applicationOptions.HttpClientAddress)
                .NotNull()
                .NotEmpty()
                .WithMessage("HttpClientAddress must be informed");

            return validator
                .Validate(options, strategy => strategy.ThrowOnFailures())
                .IsValid;
        })
    .ValidateOnStart();

結論
このツールは、より良い開発環境を支援する強力な単純な.