自注册类没有实例创建

时间:2013-06-01 02:19:39

标签: c#

在我的应用程序中,有一组数据提供程序和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
    {

    }

如何让它发挥作用?

1 个答案:

答案 0 :(得分:1)

您只需访问班级的任何静态方法/属性,即Provider1.Name

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

只有在C#规范10.11 Static constructors中涵盖任何类型的方法时,才会调用C#静态构造函数(初始化所有静态字段的构造函数):

  

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

请注意,编写单元测试很难进行神奇的注册 - 因此,虽然您的方法可行,但最好使用一些允许注册便于测试的对象的已知系统。