5

シングルトンである .NET でレジストリ クラスを作成しました。どうやら、このシングルトンはキャッシュに保持されているかのように動作します (シングルトン オブジェクトは各セッションで使用できます)。これは、このシングルトンをキャッシュに追加することの良い習慣ですか? + GetInstance() 関数の同時実行の問題に注意する必要はありますか?

namespace Edu3.Business.Registry
{
    public class ExamDTORegistry
    {
        private static ExamDTORegistry instance;
        private Dictionary<int, ExamDTO> examDTODictionary;

        private ExamDTORegistry()
        {
            examDTODictionary = new Dictionary<int, ExamDTO>();
        }

        public static ExamDTORegistry GetInstance()
        {
            if (instance == null)
            {
                instance = new ExamDTORegistry();
            }
            return instance;
        }
    }
}
4

6 に答える 6

6

確かに、GetInstance メソッドはスレッド セーフではありません。2 つのスレッドが同時に呼び出すと、2 つの異なるインスタンスになる可能性があります。シングルトン パターンの実装に関するページがあります。

あなたのコードはそれがシングルトンであることに依存していますか? AppDomain がリロードされると、新しいインスタンスが取得されることに注意してください。

ただし、オブジェクトをキャッシュに入れることに大きなメリットがあるとは思えません。特に考えていることはありますか?

于 2008-11-19T14:38:42.870 に答える
5

GoF シングルトンに存在するにもかかわらず、一般的に悪い習慣と見なされます。インスタンスを 1 つだけにしたい理由はありますか?

于 2008-11-19T14:39:32.963 に答える
2

HttpContext.Cacheはすべてのセッションで使用できますが、キャッシュ内のアイテムは、期限切れになったとき、またはメモリ不足が発生したときにメモリから削除できます。

HttpContext.Applicationはすべてのセッションで使用でき、永続的なアプリケーション全体のオブジェクトを格納するのに最適な場所です。

すでにシングルトンを作成して機能しているので、キャッシュが提供する追加機能が必要でない限り、代わりに組み込みのシングルトンコレクションの1つを使用する必要がある理由がわかりません。

于 2008-11-19T19:43:38.450 に答える
0

キャッシュの意味がわからない...これをキャッシュしたい場合(たとえば...データストアから再度フェッチする必要がないようにメモリに保持する)、はい、それを入れることができますキャッシュであり、すべてのユーザーに対してグローバルになります。セッションはユーザーごとを意味するので、これはあなたが望むものではないと思います。

于 2008-11-19T14:40:50.090 に答える
-1

i would make it like:

private static READONLY ExamDTORegistry instance;

then you dont need to check for NULL and its thread safe.

于 2009-02-12T17:12:42.133 に答える