0

シングルトンの遅延読み込みを行うには、次のパターンを使用することを学びました。

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アプリケーションで気にする必要があることですか?

4

4 に答える 4

4

遅延読み込みは通常、データベースから何かを遅延読み込みしていることを意味します。あなたがしていることは通常「遅延初期化」と呼ばれます(技術的には「遅延初期化」は遅延読み込みパターンの実装方法です)。

元の質問について:まず、シングルトンは必要ありません。それでも必要な場合は、これを適切に行う方法を次に示します第三に、シングルトンは必要ありません。

于 2009-05-06T10:50:07.917 に答える
3

シングルトンを必要としない静的メソッドがない限り、静的コンストラクターを含めるだけでクラスを怠惰にすることができます。静的コンストラクターがなければ、それはまだほとんど怠惰です。

詳細とオプションについては、私のシングルトン実装ページを参照してください。

私は通常、質問の最後にあなたが与えたコードを使います-それが使用される予定がない限り、シングルトンを本当に初期化したくないのでなければ、それは十分に怠惰です。(基本的にbeforefieldinitsetを使用すると、JITは通常、メソッドで使用されるすべての型が初期化されることを確認します。beforefieldinit実行中にクラスが最初に実際に使用されるまで待つ必要はありません。詳細については、私のbeforefieldinitページを参照してください。ただし、重要な点はアセンブリがロードされるとすぐに、またはそのようなもので、すべてのシングルトンを初期化することはまだありません。)

于 2009-05-06T10:48:06.253 に答える
1

これはすべて問題ありませんが、遅延読み込みのポイントは、必要になるまで(通常は管理されていない)リソース(データベースやファイルシステムなどにアクセスする)を読み込まないようにすることです。これにより、実際には読み込まないときに先制的に読み込まれるのを防ぎます。する必要があります。シングルトンパターンの使用自体は、いつでもマネージドインスタンスを正確に作成できるため、必ずしも遅延読み込みを意味するわけではありません。

遅延読み込みの側面は、適切なメソッド呼び出しが行われた場合にのみ、読み込むリソースにアクセスする場合に役立ちます。そのシングルトンインスタンスが作成されたときに、それが大量のデータベースクエリを実行し、結果を隠している場合、私に関する限り、遅延読み込みではありません。

ORMシナリオに関して、遅延読み込みとは通常、関係内の別のオブジェクトの読み込みを最初のアクセスまで延期することを直接指します。これにより、2番目の潜在的に不要なクエリの実行が回避されます。

繰り返しになりますが、オブジェクトの使用中にその関係をナビゲートすることがわかっている場合(つまり、オブジェクトなどUserを一覧表示するためにを取得した場合Posts)、ORMに次のように指示することをお勧めします。関連するオブジェクトを同時にロードします。これにより、通常、ループして後で複数のクエリを実行するのではなく、結合を使用して単一のクエリを実行するようになります。この場合、遅延読み込みは必要ありません。

于 2009-05-06T10:50:31.927 に答える
0

ページの読み込み、セッション、アプリケーションの存続期間を混同しないように注意してください。そうは言っても、静的シングルトンインスタンスを使用してもよろしいですか?作成されると、アプリケーション(Webサーバー)がシャットダウンされるか、 iisresetを実行するまで存続します。

HttpContext.Current.Itemsページの読み込みごとに1つの遅延ロードされるインスタンスが必要HttpContext.Current.Sessionな場合、またはユーザーごとに1つのインスタンスが必要な場合は、代わりにキャッシュすることを検討してください。

于 2009-05-06T11:12:17.473 に答える