Azure Functions で設定情報を IConfiguration型で扱いたい。欲を言えば IOptions<T>で扱いたいというケースについて。
端的に言うとドキュメントに記載があります。以下のページにいくと Azure Functions での DI の仕方が書いてあって、その中には IConfigurationがプラットフォームから提供されているのでそれを使う感じです。
.NET Azure Functions で依存関係の挿入を使用する
やってみよう
Azure Functions のプロジェクトを作成したら Microsoft.Azure.Functions.Extensionsを参照に追加します。そして、Startup.cs クラスを作ります。Startup クラスは Microsoft.Azure.Functions.Extensions.DependencyInjection.FunctionsStartupクラスを継承して Configure メソッドで色々追加していきます。
以下のクラスはプラットフォームで提供しているから使ってもいいよってドキュメントに書いてあります
- Microsoft.Extensions.Configuration.IConfiguration
- Microsoft.Azure.WebJobs.Host.Executors.IHostIdProvider
デバッガーで止めてみると色々 (96 個!?) 登録されてるみたいですけど、あんまり登録されてるからって使わない方がいいのかもしれないですね。
ここまで来たらこっちのもんです、適当に情報設定するためのクラスを定義します。例えば以下のように
publicclassInfo{publicstringName{get;set;}}そして local.settings.jsonに Info:Nameというキーで適当な値を設定します。
{"IsEncrypted":false,"Values":{"AzureWebJobsStorage":"UseDevelopmentStorage=true","FUNCTIONS_WORKER_RUNTIME":"dotnet","Info:Name":"Hello world"}}そして Startup.cs で AddOptionsメソッドで登録します。
usingFunctionApp2;usingMicrosoft.Azure.Functions.Extensions.DependencyInjection;usingMicrosoft.Extensions.Configuration;usingMicrosoft.Extensions.DependencyInjection;[assembly:FunctionsStartup(typeof(Startup))]namespaceFunctionApp2{publicclassStartup:FunctionsStartup{publicoverridevoidConfigure(IFunctionsHostBuilderbuilder){builder.Services.AddOptions<Info>().Configure<IConfiguration>((info,configuration)=>configuration.Bind("Info",info));}}}ここまでおぜん立てすると関数で利用できます。例えば、この Info の Name をそのまま返す関数を作るとこんな感じです。
usingSystem.Threading.Tasks;usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.Azure.WebJobs;usingMicrosoft.Azure.WebJobs.Extensions.Http;usingMicrosoft.AspNetCore.Http;usingMicrosoft.Extensions.Logging;usingMicrosoft.Extensions.Options;namespaceFunctionApp2{publicclassFunction1{privatereadonlyIOptions<Info>_info;publicFunction1(IOptions<Info>info){_info=info;}[FunctionName("Function1")]publicasyncTask<IActionResult>Run([HttpTrigger(AuthorizationLevel.Function,"get","post",Route=null)]HttpRequestreq,ILoggerlog){log.LogInformation(_info.Value.Name);returnnewOkObjectResult(_info.Value.Name);}}}実行してエンドポイントを叩くとこんな感じの結果になります。思った通りですね。
Azure にデプロイした後は、Function App の構成に Info__Nameのように local.settings.json では :区切りで登録したものを以下のように __区切りで登録します。
エンドポイントを叩くと以下のようになりました。ちゃんと値が取れてますね。
いい感じ。



