缓存约定和覆盖

时间:2011-11-20 22:26:15

标签: fluent-nhibernate automapping override

我已经制定了一个允许默认缓存所有entites的约定。 但对于一些entites我想删除缓存。我想过要用 AutoMappingOverriding但我不知道是否可以说 AutoMappingOverriding中的NoCache。

谢谢,

1 个答案:

答案 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>>