プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2018/11/06

ASP.NET Core で AddSingleton しているのにインスタンスが複数作成される

update2018/11/10 event_note2018/11/06 2:27

ASP.NET Core (.NET Core) において、AddSingleton でサービスを登録しているのに、コンストラクタが複数回呼ばれることがありました。

尚、Stackoverflow に同様の質問がありました。

問題となるコードの例

サービスの登録は Startup.csConfigureServices メソッドで行いますが、私はここで以下のようなコードを書いてしまっていました。

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();
}