ごった煮

色々な事を書いてます

ASP.NET Core MVCでAzure App Configurationを使う

App Configurationは、ASP.NET Coreでも使えるようにクライアントライブラリが提供されているので、簡単な実装を試してみます。

実装する

前提

  • App Configurationに設定を追加してある
  • ASP.NET Core MVCのテンプレートを作っておく

パッケージを入れる

以下のパッケージをNuGetから入れます。

Microsoft.Extensions.Configuration.AzureAppConfiguration

一番シンプルな読み込み

Program.csのCreateWebHostBuilderの設定を以下のようにします。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        var settings = config.Build();
        config.AddAzureAppConfiguration("接続文字列");
    })
        .UseStartup<Startup>();
}

これでApp Configurationの設定は、完了です。 あとは、IConfigurationから通常のアプリケーション設定と同じように設定を読み出せます。 この設定の場合、ラベルをセットしていない設定のみ取得可能です。

ラベルを指定して読み込む

ラベルを指定して読み出す場合は、Function Appと同じようにUseメソッドを使用します。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        var settings = config.Build();
        config.AddAzureAppConfiguration(_ => 
            _.Connect("接続文字列")
            .Use("キー名", "ラベル名"));
    })
    .UseStartup<Startup>();

更新を検知する

更新を検知する場合もFunction Appと同様にWatchメソッドを使用して変更の監視を設定します。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        var settings = config.Build();
        config.AddAzureAppConfiguration(_ => 
            _.Connect("接続文字列")
            .Watch("キー名", "ラベル名", TimeSpan)
            .Use("キー名", "ラベル名"));
    })
    .UseStartup<Startup>();

これで指定したTimeSpanの度に設定の変更をポーリングして、変更が入ったら自動的に差し変わります。

以下のようなViewを用意して画面をリロードしてやると、変化が分かりやすいと思います。

@using Microsoft.Extensions.Configuration
@inject IConfiguration Configuration

<div class="text-center">
    <h1 class="display-4">@(Configuration["Message"])</h1>
</div>

特定の設定が変更されたタイミングで全部を再読み込みしたい場合もFunction Appと同じくWatchAndReloadAllメソッドを使用します。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
    .ConfigureAppConfiguration((hostingContext, config) =>
    {
        var settings = config.Build();
        config.AddAzureAppConfiguration(_ => 
            _.Connect("接続文字列")
            .Use("キー名", "ラベル名")
            .WatchAndReloadAll("キー名2", "ラベル名2", TimeSpan)
            .Use("キー名2", "ラベル名2")
            );
    })
    .UseStartup<Startup>();

まとめ

基本的にFunction AppもASP.NET Coreも同じ.NET Coreなのでほとんど違い無く使用できます。

特に難しいこともなくASP.NET Coreに組み込めるのは、かなり便利かなと思います。