我已经制定了一个允许默认缓存所有entites的约定。 但对于一些entites我想删除缓存。我想过要用 AutoMappingOverriding但我不知道是否可以说 AutoMappingOverriding中的NoCache。
谢谢,
答案 0 :(得分:1)
使用another slightly related post我想出了以下内容:
// setup caching
var typesToIgnoreForCaching = new Type[] { typeof(Type1ToNotCache), typeof(Type2ToNotCache) };
var typesToCache = typeof(IEntity).Assembly.GetTypes().Where(t => config.ShouldMap(t)
&& !typesToIgnoreForCaching.Contains(t)).ToList();
var cacheOverride = new CacheOverride();
cacheOverride.DoOverrides(m, typesToCache);
CacheOverride类如下:
class CacheOverride : PersistenceOverride<object>
{
public override Action<AutoMapping<T>> MyOverride<T>()
{
return am =>
{
am.Cache.ReadWrite();
};
}
}
PersistenceOverride类的位置为:
abstract class PersistenceOverride<I>
{
public void DoOverrides(AutoPersistenceModel model, IEnumerable<Type> Mytypes)
{
foreach (var t in Mytypes.Where(x => typeof(I).IsAssignableFrom(x)))
ManualOverride(t, model);
}
private void ManualOverride(Type recordType, AutoPersistenceModel model)
{
var t_amt = typeof(AutoMapping<>).MakeGenericType(recordType);
var t_act = typeof(Action<>).MakeGenericType(t_amt);
var m = typeof(PersistenceOverride<I>)
.GetMethod("MyOverride")
.MakeGenericMethod(recordType)
.Invoke(this, null);
model.GetType().GetMethod("Override").MakeGenericMethod(recordType).Invoke(model, new object[] { m });
}
public abstract Action<AutoMapping<T>> MyOverride<T>() where T : I;
}
基本上,所有这一切都是通过反射遍历域中的实体列表,并使用您的约定缓存策略手动覆盖每个实体。您只需要将不需要缓存的类型添加到typesToIgnoreForCaching中。
此外,您需要修改typesToCache行,以便它与您设置域名相对应。
感谢Tom为代码生成Action<AutoMapping<T>>