2011-11-20 94 views
2

我做了一個約定,默認情況下允許緩存所有實體。 但對於一些我想要刪除緩存的實體。我想過使用 AutoMappingOverriding,但我不知道是否可以在AutoMappingOverriding中說 NoCache。緩存約定和覆蓋

感謝,

回答

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行,以便它與您設置域的對應關係相同。

感謝湯姆生產的代碼Action<AutoMapping<T>>