在我的应用程序中,有一组数据提供程序和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
{
}
如何让它发挥作用?
答案 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#静态构造函数(初始化所有静态字段的构造函数):
类的静态构造函数在给定的应用程序域中最多执行一次。静态构造函数的执行由应用程序域中发生的以下第一个事件触发:
•创建类的实例 •引用该类的任何静态成员。
请注意,编写单元测试很难进行神奇的注册 - 因此,虽然您的方法可行,但最好使用一些允许注册便于测试的对象的已知系统。