Webアプリケーションで遅延読み込みを気にする必要がありますか?

StackOverflow https://stackoverflow.com/questions/829036

質問

シングルトンレイジーロードを行うには、これが使用するパターンであることを学びました:

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 にキャッシュすることを検討してくださいユーザーごと。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top