ASP.NET Core (.NET Core) において、AddSingleton
でサービスを登録しているのに、コンストラクタが複数回呼ばれることがありました。
尚、Stackoverflow に同様の質問がありました。
問題となるコードの例
サービスの登録は Startup.cs
の ConfigureServices
メソッドで行いますが、私はここで以下のようなコードを書いてしまっていました。
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddSingleton<IFoo, Foo>();
IServiceProvider serviceProvider = services.BuildServiceProvider();
serviceProvider.GetRequiredService<IFoo>().DoSomething();
}
この場合、ここで一度インスタンスが作成されますが、この後にサービスプロバイダの構築が行われて新しいコンテナが作成されるので、その後に DI したタイミングでも再度インスタンスが作成されてしまいます。
どうすればよい?
サービスの登録は ConfigureServices
メソッドで行い、サービスの取得は Configure
メソッドで行います。
public void ConfigureServices(IServiceCollection services)
{
// ...
services.AddSingleton<IFoo, Foo>();
}
public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider)
{
// ...
serviceProvider.GetRequiredService<IFoo>().DoSomething();
}