1. ホーム
  2. c#

[解決済み] ASP.NET CoreはDI設定後にシングルトンを初期化する

2023-07-11 16:22:50

質問

例えば、以下のようなシングルトンクラスのインスタンスをDIに登録するとします。

services.AddSingleton<IFoo, Foo>();

そして、仮に Foo クラスが他の多くの依存関係(主にデータをロードするためのリポジトリクラス)を持っているとします。

私の現在の理解では、Fooインスタンスは最初に使用される(asked)まで作成されません。コンストラクター以外にこのクラスを初期化する方法はありますか?例えば ConfigureServices() が完了した直後とか?それとも初期化コード(dbからデータをロードする)はFooのコンストラクタで行うべきでしょうか?

(このクラスが初回使用前にデータをロードして、初回アクセスを高速化できればいいのですが...)

どのように解決するのですか?

起動時に自分で行う。

var foo = new Foo();
services.AddSingleton<IFoo>(foo);

または "温める"。

public void Configure(IApplicationBuilder app) 
{
    app.ApplicationServices.GetService<IFoo>();
}

または、その代わりに

public void Configure(IApplicationBuilder app, IFoo foo) 
{
    ...
}

しかし、コンストラクタでやってはいけないことをやってしまうと、これは単に汚いだけで、むしろ設計に問題があるように感じられます。クラスのインスタンス化は高速でなければならず、その中で長時間実行される操作を行うと、多くのベストプラクティスに反することになり、それを回避する方法を探すのではなく、コードベースをリファクタリングする必要があります。