2012-04-09 1 views
0

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

Благодаря

ответ

0

Я ранее использовал RealProxy для этого типа функциональности. Я привел несколько примеров в своем блоге; Intercepting method invocations using RealProxy.

Быстрый пример кэширующего прокси-сервера с использованием хэш-кода метода (чтобы гарантировать, что два разных метода с одинаковыми аргументами кэшируются отдельно) и аргументы. Обратите внимание, что нет обработки выходных параметров, а только возвращаемое значение. (Вам нужно будет изменить _cache, чтобы удерживать объект, который содержит как возвращаемое значение, так и выходные параметры, если вы хотите изменить это.) Кроме того, с этой реализацией нет никакой безопасности потока.

public class CachingProxy<T> : ProxyBase<T> where T : class { 
    private readonly IDictionary<Int32, Object> _cache = new Dictionary<Int32, Object>(); 

    public CachingProxy(T instance) 
     : base(instance) { 
    } 

    protected override IMethodReturnMessage InvokeMethodCall(IMethodCallMessage msg) { 
     var cacheKey = GetMethodCallHashCode(msg); 

     Object result; 
     if (_cache.TryGetValue(cacheKey, out result)) 
      return new ReturnMessage(result, msg.Args, msg.ArgCount, msg.LogicalCallContext, msg); 

     var returnMessage = base.InvokeMethodCall(msg); 

     if (returnMessage.Exception == null) 
      _cache[cacheKey] = returnMessage.ReturnValue; 

     return returnMessage; 
    } 

    protected virtual Int32 GetMethodCallHashCode(IMethodCallMessage msg) { 
     var hash = msg.MethodBase.GetHashCode(); 

     foreach(var arg in msg.InArgs) { 
      var argHash = (arg != null) ? arg.GetHashCode() : 0; 
      hash = ((hash << 5) + hash)^argHash; 
     } 

     return hash; 
    } 
} 
+0

Я думаю, что у вас не возникло проблемы, мне нужно знать, есть ли решение для создания ключа кэша (строки), представляющего вызов метода и его возвращаемое значение. например, кеширование SomeMethod (param1, param2), но поиск общего решения, способного кэшировать любой метод с любым числом параметров. – Ehsan

+0

Я добавил пример CachingProxy на основе класса ProxyBase , который кэширует вызовы. – sisve

+0

На основе документации MSDN метод GetHashCode не является надежным для создания уникального хеш-ключа, и если мы скажем, что мы должны реализовать этот метод для каждого типа, я думаю, что это также неверная практика http://msdn.microsoft.com/en- us/library/system.object.gethashcode.aspx строка 3 из раздела Замечания – Ehsan