我正在使用IDataErrorInfo接口来验证我的实体。只要验证逻辑从属性读取元数据,对于所有实体都是相同的,所以我创建了类
public class DataErrorInfo : IDataErrorInfo
所有实体都从中汲取营养。事实是,我希望缓存派生类的反射信息以加快验证速度,因此每个实体类型应该在每个运行的应用程序中初始化此缓存一次。
我正在考虑使用static readonly
字段,但发现它是用第一个使用的实体类型的反射信息初始化的,所以如果有实体A和实体B,并且实体A首先被访问,实体B将拥有实体A反射缓存。
答案 0 :(得分:2)
您可以使用Dictionary<Type, DataErrorInfo>
作为Singleton实施。
Singleton模式强制内存中只存在一个Dictionary
。 Dictionary
本身将强制执行约束,即每个类型将一个条目作为Key
获取。您的Value
将是您想要缓存的任何反射信息。在这种情况下,它看起来像是DataErrorInfo
。
答案 1 :(得分:1)
在泛型类中,如果你有一个静态的,它可以用于封闭的泛型类型。 将您的基类定义为通用(具有一些奇怪但有效的约束)
public class DataErrorInfo<T> : IDataErrorInfo where T : DataErrorInfo<T>{
...
}
然后你定义你的派生类(注意派生类本身作为T传递给基础泛型类型)
public class EntityClass : DataErrorInfo<EntityClass>{
...
}
这样任何静态都限定为派生类而不是父类,只要你不这样做
public class AnotherEntityClass : DataErrorInfo<EntityClass>{
...
}