web-dev-qa-db-ja.com

ASP.NET Coreは、DIの構成後にシングルトンを初期化します

したがって、DIに次のように登録するシングルトンクラスインスタンスがあるとします。

_services.AddSingleton<IFoo, Foo>();
_

また、Fooクラスには他にも多くの依存関係があるとしましょう(主にデータをロードできるリポジトリクラス)。

私の現在の理解では、Fooインスタンスは最初に使用(要求)されるまで作成されません。コンストラクタ以外にこのクラスを初期化する方法はありますか? ConfigureServices()が完了した直後のように?または、Fooのコンストラクターで初期化コード(dbからデータを読み込む)を実行する必要がありますか?

(このクラスが初めてアクセスする前にデータをロードできれば、初めてのアクセスを高速化できます。)

23
pbz

起動時に自分で実行してください。

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

または「ウォームアップ」

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

または代わりに

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

しかし、これは単に汚い感じであり、コンストラクタで行うべきではない何かを行うと、設計上の問題となります。クラスのインスタンス化は高速である必要があり、その中で長時間実行する操作を行うと、多数のベストプラクティスに違反し、コードベースをハックする方法を探すのではなく、コードベースをリファクタリングする必要があります。

42
Tseng