Azure Functionsで依存関係の挿入する方法は、Microsoft Docsに記載されていた。
しかしWeb Jobsでやる方法がどこにも記載されていなかったので、備忘録として残しておく。
前提
タイトルでも記載しているようにここで記載する方法は、NoAutomaticTrigger(Web Jobsを手動で起動する場合)のやり方です。
自動トリガーの場合は、Azure Functionsと同じ方法でコンストラクタでの依存関係の挿入ができるらしい。
手動トリガーで同じ方法が使えない理由
手動トリガーで起動させるには、対象のメソッドにある制約が生まれる。
- NoAutomaticTrigger属性を付与する。
- publicである。
- staticである。
この最後の制約のために、コンストラクタで依存関係が挿入できない。
結論
コンストラクタがダメなら引数で依存関係を挿入する。
Functions.cs
[NoAutomaticTrigger]
public static void CreateQueueMessage(ISampleServiceA sampleServiceA)
{
sampleServiceA.DoIt();
}
Program.cs
static async Task Main(string[] args)
{
var builder = new HostBuilder();
builder.ConfigureWebJobs(b =>
{
b.AddAzureStorageCoreServices();
b.AddAzureStorage();
});
builder.ConfigureServices((context, services) =>
{
services.AddSingleton<ISampleServiceA, SampleServiceA>();
});
var host = builder.Build();
using (host)
{
var jobHost = host.Services.GetService(typeof(IJobHost)) as JobHost;
// GetService<T>でインスタンスを取得する
// この時にDictionaryのKeyは引数名と一致させておくこと
var inputs = new Dictionary<string, object>
{
{ "sampleServiceA", host.Services.GetService<ISampleServiceA>() }
};
await host.StartAsync();
// Functionsを呼び出す際に引数として渡してあげる
await jobHost.CallAsync("CreateQueueMessage", inputs);
await host.StopAsync();
}
}
ここに辿り着くまでに結構時間かかった。