0

私のアプリケーションには、一連のデータ プロバイダーと Redis Cache があります。実行ごとに異なるプロバイダーが使用されますが、それらはすべて独自のデータを Redis に保存します。

hset ProviderOne Data "..."
hset ProviderTwo Data "..."

コードに存在するすべてのプロバイダーのデータを削除する 1 つのメソッドが必要です。

del ProviderOne
del ProviderTwo

次のコードを作成しました:

   void Main()
   {
       // Both providers have static field Hash with default value.
       // I expected that static fields should be initialized when application starts,
       // then initialization will call CacheRepository.Register<T>() method
       // and all classes will register them self in CacheRepository.RegisteredHashes.

       // But code start working only when i created this classes (at least once)
       // new ProviderOne();
       // new ProviderTwo();

       CacheRepository.Reset();
   }

   public abstract class AbstractProvider
   {
      //...
   }

   public class ProviderOne : AbstractProvider
   {
       public static readonly string Hash = 
          CacheRepository.Register<ProviderOne>();

       //...
   }

   public class ProviderTwo : AbstractProvider
   {
       public static readonly string Hash = 
          CacheRepository.Register<ProviderTwo>();

       //...
   }

   public class CacheRepository
    {
        protected static Lazy<CacheRepository> LazyInstance = new Lazy<CacheRepository>();

        public static CacheRepository Instance
        {
            get { return LazyInstance.Value; }
        }

        public ConcurrentBag<string> RegisteredHashes = new ConcurrentBag<string>();

        public static string Register<T>()
        {
            string hash = typeof(T).Name;

            if (!Instance.RegisteredHashes.Contains(hash))
            {
                Instance.RegisteredHashes.Add(hash);
            }

            return hash;
        }

        public static void Reset()
        {
            foreach (string registeredHash in Instance.RegisteredHashes)
            {
                Instance.Reset(registeredHash);
            }
        }

        protected void Reset(string hash);
    }



    interface IData{}

    interface IDataProvider
    {
       string GetRedisHash();
       IData GetData();
    }

    intefrace IRedisRepository
    {

    }

どのように機能させるのですか?

4

1 に答える 1

1

クラスの静的メソッド/プロパティにアクセスできます-つまりProvider1.Name

   public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Provider1.Name + Provider2.Name);
            Console.ReadLine();
        }
    }

C# では、静的コンストラクター (すべての静的フィールドを初期化するもの) は、C# 仕様10.11 静的コンストラクターでカバーされている型のメソッドが使用されている場合にのみ呼び出されます。

クラスの静的コンストラクターは、特定のアプリケーション ドメインで最大 1 回実行されます。静的コンストラクターの実行は、アプリケーション ドメイン内で次のイベントの最初の発生によってトリガーされます。
• クラスのインスタンスが作成されます。
• クラスの静的メンバーのいずれかが参照されている。

魔法の登録は単体テストを作成するのが非常に難しいことに注意してください。そのため、アプローチは機能しますが、テストに便利なオブジェクトを登録できる既知のシステムを使用する方がよい場合があります。

于 2013-06-01T03:50:46.740 に答える