Webアプリケーションで遅延読み込みを気にする必要がありますか?
-
06-07-2019 - |
質問
シングルトンレイジーロードを行うには、これが使用するパターンであることを学びました:
private MyObject()
{
}
public static MyObject Instance
{
get { return SingletonCreator.CreatorInstance; }
}
private static class SingletonCreator
{
private static readonly MyObject _instance = new MyObject();
public static MyObject CreatorInstance
{
get { return _instance; }
}
}
しかし、より単純なパターンは次のとおりです。
private static readonly MyObject _instance = new MyObject();
private MyObject()
{
}
public static MyObject Instance
{
get { return _instance; }
}
これは遅延読み込みではありません。しかし、これは本当にWebアプリケーションで気にしなければならないことですか?
解決
シングルトンを必要としない静的メソッドがない限り、クラスを遅延させるには静的コンストラクターを含めるだけで十分です。静的コンストラクターがなければ、まだ mostly 怠laです。
詳細とオプションについては、シングルトン実装ページをご覧ください。
>通常、質問の最後に指定したコードを使用します-使用しない限り、シングルトンを初期化したくない場合を除き、十分に怠laです。 (基本的に beforefieldinit
を設定すると、JITは通常、メソッドで使用されるすべての型が初期化されることを確認します; beforefieldinit
なしでは、クラスの最初の実際の使用まで待機する必要があります詳細については、 beforefieldinit
ページをご覧ください。 -しかし、重要な点は、アセンブリがロードされるとすぐにすべてのシングルトンを初期化しないこと、またはそのようなことです。)
他のヒント
これで十分ですが、遅延ロードのポイントは、必要になるまで(通常は管理されていない)リソースをロードしないようにすることです(データベース、ファイルシステムなどにヒットする)。本当にする必要はありません。いつでもマネージドインスタンスを非常に正確に作成できるため、シングルトンパターンの使用自体は、必ずしも遅延読み込みを意味するわけではありません。
適切なメソッド呼び出しが行われたときにのみロードするリソースにアクセスすると、遅延ロードの側面が作用します。そのシングルトンインスタンスが作成されたときに、データベースクエリが大量に実行され、結果が隠されている場合、私が考える限り、遅延読み込みではありません。
ORMシナリオに関して、遅延読み込みは通常、関係にある別のオブジェクトの読み込みを最初のアクセスまで延期することを指します。これにより、潜在的に不要な2番目のクエリの実行が回避されます。
次に、オブジェクトの使用中にその関係をナビゲートすることがわかっている場合(つまり、 User
を取得して、その >投稿
など)、ORMに関連するオブジェクトを同時にロードするように指示すると、通常、ループして複数の実行を行うのではなく、結合を使用して単一のクエリを実行するようになります後でクエリ。この場合、遅延読み込みは必要ありません。
ページの読み込み、セッション、およびアプリケーションの有効期間を混同しないようにしてください。そうは言っても、静的シングルトンインスタンスを使用してもよろしいですか?作成されると、アプリケーション(Webサーバー)がシャットダウンされるか、 iisreset を実行するまで有効になります。
ページの読み込みごとに1つの遅延読み込みインスタンスが必要な場合は、代わりに HttpContext.Current.Items
にキャッシュするか、必要であれば HttpContext.Current.Session
にキャッシュすることを検討してくださいユーザーごと。