2
我做了一個約定,默認情況下允許緩存所有實體。 但對於一些我想要刪除緩存的實體。我想過使用 AutoMappingOverriding,但我不知道是否可以在AutoMappingOverriding中說 NoCache。緩存約定和覆蓋
感謝,
我做了一個約定,默認情況下允許緩存所有實體。 但對於一些我想要刪除緩存的實體。我想過使用 AutoMappingOverriding,但我不知道是否可以在AutoMappingOverriding中說 NoCache。緩存約定和覆蓋
感謝,
使用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行,以便它與您設置域的對應關係相同。
感謝湯姆生產的代碼Action<AutoMapping<T>>