0

在我的应用程序中有一组数据提供者和 Redis 缓存。每次执行都使用不同的提供者,但它们都将自己的数据存储在 Redis 中:

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

我想要一种方法来删除代码中存在的所有提供者的数据。

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 静态构造函数中所涵盖的任何类型方法时才被调用:

类的静态构造函数在给定的应用程序域中最多执行一次。静态构造函数的执行由在应用程序域中发生的以下事件中的第一个触发:
• 创建类的实例。
• 类的任何静态成员都被引用。

请注意,神奇的注册很难为其编写单元测试 - 因此,尽管您的方法可行,但使用一些允许注册便于测试的对象的已知系统可能会更好。

于 2013-06-01T03:50:46.740 回答