1

C# Web フォームを使用してイントラネットを構築しています。キャッシュしている多数のユーザーを含むリスト オブジェクトがあります。MainADList を参照すると、次のことを行うコンストラクターを作成しようとしています。

  1. キャッシュに存在し、null でない場合は、それを使用します
  2. それ以外の場合は、リストを生成してキャッシュします

キャッシュと取得を行うコードはありますが、希望する方法でうまくカプセル化されていません。

public Users MainADList = new Users();

private void GenerateADList()
{
    MainADList = (Users) Cache["MainADList"];

    if (MainADList == null || MainADList.Count == 0)
    {
       //generate the list....

       Cache["MainADList"] = MainADList;
    }
 }

ありがとう!

4

3 に答える 3

6

それを行うコンストラクターを作成することはできません。コンストラクターは常に新しいオブジェクトを作成します。

代わりに、静的ファクトリメソッドを作成します。

public static Users GetUsers()
{
    // Consult the cache, and create a new instance if necessary.
}

これはシングルトンかもしれませんが、そうである必要はありません。(本当にそうしなければならない場合を除いて、人為的にそのシングルトン性を押し付けることはしません。私はシングルトン パターンの大ファンではありません。)

または、静的ファクトリ メソッドの代わりに、ファクトリ クラスにインスタンスメソッドを含めることもできます。

public class UsersFactory
{
    // Construct it with a cache, or whatever's required

    public Users GetUsers()
    {
        // Use the cache, or construct a new value.
    }
}

静的(グローバル)状態に依存していないため、これはよりテストしやすくなりました。代わりに、各テストで新しいキャッシュから新しいファクトリを作成できます。

これらすべてのソリューションで、必要なスレッド動作を検討する必要があります。値を 1 回だけ作成するようにしたい場合はLazy<T>、 、静的初期化子の保証、またはロックを使用する必要があります。

于 2013-01-15T17:46:48.613 に答える
0

あなたが従うことができる1つの一般的なパターン:

public class ClassName {
  public static Object CachedObject {
    get {
      Object o = (Object)Cache['CacheKey'];
      if (o == null)
      {
         o = GetData();
         Cache["CacheKey"] = o;
      }
      return o;
    }
  }
}

そして、ClassName.CachedObjectを常に、永遠に、そして魔法のように取り込まれているかのように扱います。

于 2013-01-15T17:52:23.843 に答える
-3

必要なものはシングルトンとして知られています。

基本的に、すでに持っているコードで何をすべきかは、次のようなものです。

public static GetList
{
   get 
      {
          //check if list exists and create it - so basically call your private constructor
          //return cached list
      }
}
于 2013-01-15T17:44:44.577 に答える