Соглашение о кэше и переопределение - PullRequest
2 голосов
/ 21 ноября 2011

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

Спасибо

1 Ответ

1 голос
/ 10 февраля 2012

Используя еще один слегка связанный пост Я придумал следующее:

// 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>>

...