Используя еще один слегка связанный пост Я придумал следующее:
// 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();
};
}
}
Где класс PersistenceOverrideis:
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>>