🙆

.NET のオプション パターンで設定が正しい値かどうか検証をしたい

2023/05/12に公開

.NET のオプション パターンは、最近の .NET のお作法に従って書いていたら大体使うことになると思います。
これには、ちゃんと構成情報に正しい値が入っているのか検証するという機能もあります。この機能を使うと正しくない値が設定に入っているときに、実際にその値を使うよりも前にチェックしてくれます。
そのため、設定ミスによって変な動きになってしまったというようなバグを軽減することが出来ます。

毎回毎回、この方法を調べるときに上記のリンクのドキュメントを見ているのですが、毎回ドキュメント内から該当箇所を探すのもメンドイので、ここにポイントだけメモしておきます。

検証の有効化方法

一番簡単に検証出来るのはおなじみの DataAnnotations を使った方法なので、その機能を持った NuGet パッケージをインストールします。
インストールする NuGet パッケージは以下になります。

  • Microsoft.Extensions.Options.DataAnnotations

後は、設定情報を格納するためのクラスに対して DataAnnotations の検証を行うように属性などを追加します。例えば以下のようにすることで 2 つの設定項目は必須扱いになります。

using System.ComponentModel.DataAnnotations;

namespace ConsoleApp1.Options;
public class AzureOpenAIOptions
{
    [Required]
    public required string Endpoint { get; set; }
    [Required]
    public required string ModelDeployName { get; set; }
}

後は DI コンテナに対して、検証を有効にするように設定を追加します。

services.AddOptions<AzureOpenAIOptions>()
    .BindConfiguration(nameof(AzureOpenAIOptions))
    .ValidateDataAnnotations();

appsettings.json などに特に何も設定していない状態で、この IOptions<AzureOpenAIOptions> を使用すると以下のような例外が発生します。

Microsoft.Extensions.Options.OptionsValidationException: 'DataAnnotation validation failed for 'AzureOpenAIOptions' members: 'Endpoint' with the error: 'The Endpoint field is required.'.; DataAnnotation validation failed for 'AzureOpenAIOptions' members: 'ModelDeployName' with the error: 'The ModelDeployName field is required.'.'

appsettings.json に値を正しく設定していると例外が置きません。

まとめ

構成情報が正しいかどうかのチェックは、ちゃんとしたアプリを作るときには必ずやることだと思うので、この機能を使って楽しましょう。

Microsoft (有志)

Discussion