Соглашение о кэшировании и переопределение

Я сделал соглашение, которое по умолчанию разрешает кэширование всех сущностей. Но для некоторых сущностей я хочу убрать кеширование. Я думал об использовании AutoMappingOverriding, но не знаю, можно ли сказать NoCache в AutoMappingOverriding.

Спасибо,


person Yann    schedule 20.11.2011    source источник


Ответы (1)


Используя другой слегка связанный 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>>

person Mark Jerzykowski    schedule 10.02.2012