Azure Functions では、依存関係挿入 (DI) ソフトウェア設計パターンがサポートされています。これは、クラスとその依存関係 の間で制御の反転 (IoC) を実現する手法です。
Azure Functions の依存関係の挿入は、.NET Core 依存関係挿入機能に基づいて構築されています。 .NET Core 依存関係の挿入に関する知識をお勧めします。 従量課金プランで依存関係をオーバーライドする方法と、Azure Functions で構成値を読み取る方法には違いがあります。
依存関係の挿入のサポートは、Azure Functions 2.x から始まります。
Von Bedeutung
この記事のガイダンスは、ランタイムでインプロセスで実行される C# クラス ライブラリ関数にのみ適用されます。 このカスタム依存関係挿入モデルは 、.NET 分離関数には適用されません。これにより、.NET 関数をアウトプロセスで実行できます。 .NET 分離ワーカー プロセス モデルは、通常の ASP.NET Core 依存関係挿入パターンに依存しています。 詳細については、.NET 分離ワーカー プロセス ガイドの 依存関係の挿入 に関するページを参照してください。
[前提条件]
依存関係の挿入を使用する前に、次の NuGet パッケージをインストールする必要があります。
Microsoft.NET.Sdk.Functions パッケージ バージョン 1.0.28 以降
Microsoft.Extensions.DependencyInjection (現在、バージョン 2.x 以降のみがサポートされています)
サービスを登録する
サービスを登録するには、 IFunctionsHostBuilder
インスタンスにコンポーネントを構成して追加するメソッドを作成します。 Azure Functions ホストは、 IFunctionsHostBuilder
のインスタンスを作成し、それをメソッドに直接渡します。
Warnung
従量課金プランまたは Premium プランで実行されている関数アプリの場合、トリガーで使用される構成値を変更すると、スケーリング エラーが発生する可能性があります。
FunctionsStartup
クラスによってこれらのプロパティが変更されると、関数アプリの起動エラーが発生します。
IConfiguration
を挿入すると、予期しない動作が発生する可能性があります。 構成ソースの追加の詳細については、構成ソース のカスタマイズを参照してください。
メソッドを登録するには、起動時に使用される型名を指定する FunctionsStartup
アセンブリ属性を追加します。
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace;
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddHttpClient();
builder.Services.AddSingleton<IMyService>((s) => {
return new MyService();
});
builder.Services.AddSingleton<ILoggerProvider, MyLoggerProvider>();
}
}
この例では、起動時にを登録するために必要な HttpClient
パッケージを使用します。
注意事項
一連の登録手順は、ランタイムがスタートアップ クラスを処理する前と後に実行されます。 そのため、次の点に注意してください。
スタートアップ クラスは、セットアップと登録のみを目的としています。 スタートアップ プロセス中に起動時に登録されたサービスは使用しないでください。 たとえば、起動時に登録されているロガーにメッセージをログに記録しないでください。 登録プロセスのこの時点では、サービスを使用するには時期が早すぎます。
Configure
メソッドが実行されると、Functions ランタイムは引き続き他の依存関係を登録します。これは、サービスの動作に影響を与える可能性があります。依存関係挿入コンテナーは、明示的に登録された型のみを保持します。 挿入可能な型として使用できる唯一のサービスは、
Configure
メソッドで設定されるサービスです。 その結果、BindingContext
やExecutionContext
などの関数固有の型は、セットアップ中や挿入可能な型として使用できません。ASP.NET 認証の構成はサポートされていません。 Functions ホストは、ASP.NET 認証サービスを構成して、コア ライフサイクル操作用の API を適切に公開します。 カスタム
Startup
クラス内の他の構成がこの構成をオーバーライドして、意図しない結果を引き起こす可能性があります。 たとえば、builder.Services.AddAuthentication()
を呼び出すと、ポータルとホスト間の認証が中断され、 Azure Functions ランタイムなどのメッセージに到達できなくなる可能性があります。
挿入された依存関係を使用する
コンストラクターの挿入は、依存関係を関数で使用できるようにするために使用されます。 コンストラクターの挿入を使用するには、挿入されたサービスや関数クラスに静的クラスを使用しないようにする必要があります。
次の例では、 IMyService
と HttpClient
の依存関係を HTTP によってトリガーされる関数に挿入する方法を示します。
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;
using System.Net.Http;
using System.Threading.Tasks;
namespace MyNamespace;
public class MyHttpTrigger
{
private readonly HttpClient _client;
private readonly IMyService _service;
public MyHttpTrigger(IHttpClientFactory httpClientFactory, IMyService service)
{
this._client = httpClientFactory.CreateClient();
this._service = service;
}
[FunctionName("MyHttpTrigger")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
var response = await _client.GetAsync("https://microsoft.com");
var message = _service.GetMessage();
return new OkObjectResult("Response from function with injected dependencies.");
}
}
この例では、起動時にを登録するために必要な HttpClient
パッケージを使用します。
サービスの有効期間
Azure Functions アプリは、ASP.NET の依存性注入と同じサービスの有効期間を提供します。 Functions アプリの場合、さまざまなサービスの有効期間は次のように動作します。
- トランジエント: トランジエントサービスは、サービスが解決されるたびに作成されます。
- スコープ: スコープ付きサービスの有効期間は、関数の実行有効期間と一致します。 スコープ付きサービスは、関数の実行ごとに 1 回作成されます。 実行中にそのサービスに対する後の要求では、既存のサービス インスタンスが再利用されます。
-
シングルトン: シングルトン サービスの有効期間はホストの有効期間と一致し、そのインスタンスでの関数の実行間で再利用されます。 シングルトン有効期間サービスは、接続とクライアント (
DocumentClient
やHttpClient
インスタンスなど) に推奨されます。
さまざまなサービス有効期間のサンプルを GitHub で表示またはダウンロードします。
ログ記録サービス
独自のログ プロバイダーが必要な場合は、カスタム型を ILoggerProvider
のインスタンスとして登録します。これは 、Microsoft.Extensions.Logging.Abstractions NuGet パッケージから入手できます。
Application Insights は、Azure Functions によって自動的に追加されます。
Warnung
ILogger<T> および ILoggerFactory
ホストは、 ILogger<T>
と ILoggerFactory
サービスをコンストラクターに挿入します。 ただし、既定では、これらの新しいログ フィルターは関数ログから除外されます。 追加のフィルターとカテゴリにオプトインするには、 host.json
ファイルを変更する必要があります。
次の例では、ホストに公開されているログを含む ILogger<HttpTrigger>
を追加する方法を示します。
namespace MyNamespace;
public class HttpTrigger
{
private readonly ILogger<HttpTrigger> _log;
public HttpTrigger(ILogger<HttpTrigger> log)
{
_log = log;
}
[FunctionName("HttpTrigger")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req)
{
_log.LogInformation("C# HTTP trigger function processed a request.");
// ...
}
次の例 host.json
ファイルは、ログ フィルターを追加します。
{
"version": "2.0",
"logging": {
"applicationInsights": {
"samplingSettings": {
"isEnabled": true,
"excludedTypes": "Request"
}
},
"logLevel": {
"MyNamespace.HttpTrigger": "Information"
}
}
}
ログ レベルの詳細については、「ログ レベルの構成」を参照してください。
関数アプリで提供されるサービス
関数ホストは、多くのサービスを登録します。 次のサービスは、アプリケーションの依存関係として安全に使用できます。
サービスの種類 | 有効期間 | 説明 |
---|---|---|
Microsoft.Extensions.Configuration.IConfiguration |
シングルトン | 実行時の構成 |
Microsoft.Azure.WebJobs.Host.Executors.IHostIdProvider |
シングルトン | ホスト インスタンスの ID の指定を担当する |
依存関係を持つ必要がある他のサービスがある場合は、 問題を作成し、GitHub で提案します。
ホスト サービスのオーバーライド
現在、ホストによって提供されるサービスのオーバーライドはサポートされていません。 オーバーライドするサービスがある場合は、 問題を作成し、GitHub で提案します。
オプションと設定の使用
アプリ設定で定義されている値は、IConfiguration
インスタンスで使用できます。これにより、スタートアップ クラスのアプリ設定の値を読み取ることができます。
IConfiguration
インスタンスからカスタム型に値を抽出できます。 アプリ設定の値をカスタム型にコピーすると、これらの値を挿入可能にすることで、サービスを簡単にテストできます。 構成インスタンスに読み込まれる設定は、単純なキーと値のペアである必要があります。 Elastic Premium プランで実行されている関数の場合、アプリケーション設定名には、文字、数字 (0-9
)、ピリオド (.
)、コロン (:
)、アンダースコア (_
) のみを含めることができます。 詳細については、「 アプリ設定に関する考慮事項」を参照してください。
アプリ設定と一致する名前のプロパティを含む次のクラスについて考えてみます。
public class MyOptions
{
public string MyCustomSetting { get; set; }
}
カスタム設定を次のように構成する可能性がある local.settings.json
ファイル。
{
"IsEncrypted": false,
"Values": {
"MyOptions:MyCustomSetting": "Foobar"
}
}
Startup.Configure
メソッド内から、次のコードを使用して、IConfiguration
インスタンスからカスタム型に値を抽出できます。
builder.Services.AddOptions<MyOptions>()
.Configure<IConfiguration>((settings, configuration) =>
{
configuration.GetSection("MyOptions").Bind(settings);
});
Bind
を呼び出すと、プロパティ名が一致する値が構成からカスタム インスタンスにコピーされます。 IoC コンテナーでオプション インスタンスを使用して関数に挿入できるようになりました。
options オブジェクトは、ジェネリック IOptions
インターフェイスのインスタンスとして関数に挿入されます。
Value
プロパティを使用して、構成で見つかった値にアクセスします。
using System;
using Microsoft.Extensions.Options;
public class HttpTrigger
{
private readonly MyOptions _settings;
public HttpTrigger(IOptions<MyOptions> options)
{
_settings = options.Value;
}
}
詳細については、「 ASP.NET Core のオプション パターン」を参照してください。
ASP.NET Core ユーザー シークレットの使用
アプリをローカルで開発する場合、ASP.NET Core には、プロジェクト ルートの外部にシークレット情報を格納できる シークレット マネージャー ツール が用意されています。 これにより、シークレットが誤ってソース管理にコミットされる可能性が低くなります。 Azure Functions Core Tools (バージョン 3.0.3233 以降) は、ASP.NET Core Secret Manager によって作成されたシークレットを自動的に読み取ります。
ユーザー シークレットを使用するように .NET Azure Functions プロジェクトを構成するには、プロジェクト ルートで次のコマンドを実行します。
dotnet user-secrets init
次に、 dotnet user-secrets set
コマンドを使用してシークレットを作成または更新します。
dotnet user-secrets set MySecret "my secret value"
関数アプリ コードでユーザー シークレットの値にアクセスするには、 IConfiguration
または IOptions
を使用します。
構成ソースのカスタマイズ
他の構成ソースを指定するには、関数アプリのConfigureAppConfiguration
クラスのStartUp
メソッドをオーバーライドします。
次の例では、基本とオプションの両方の環境固有のアプリ設定ファイルから構成値を追加します。
using System.IO;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace;
public class Startup : FunctionsStartup
{
public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
{
FunctionsHostBuilderContext context = builder.GetContext();
builder.ConfigurationBuilder
.AddJsonFile(Path.Combine(context.ApplicationRootPath, "appsettings.json"), optional: true, reloadOnChange: false)
.AddJsonFile(Path.Combine(context.ApplicationRootPath, $"appsettings.{context.EnvironmentName}.json"), optional: true, reloadOnChange: false)
.AddEnvironmentVariables();
}
public override void Configure(IFunctionsHostBuilder builder)
{
}
}
ConfigurationBuilder
の IFunctionsConfigurationBuilder
プロパティに構成プロバイダーを追加します。 構成プロバイダーの使用方法の詳細については、「 ASP.NET Core の構成」を参照してください。
FunctionsHostBuilderContext
は、IFunctionsConfigurationBuilder.GetContext()
から取得されます。 このコンテキストを使用して、現在の環境名を取得し、関数アプリ フォルダー内の構成ファイルの場所を解決します。
既定では、 appsettings.json
などの構成ファイルは、関数アプリの出力フォルダーに自動的にコピーされません。 ファイルがコピーされるように、 .csproj
ファイルを次のサンプルと一致するように更新します。
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="appsettings.Development.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>
次のステップ
詳細については、次のリソースを参照してください。