Я ранее использовал 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;
}
}
Я думаю, что у вас не возникло проблемы, мне нужно знать, есть ли решение для создания ключа кэша (строки), представляющего вызов метода и его возвращаемое значение. например, кеширование SomeMethod (param1, param2), но поиск общего решения, способного кэшировать любой метод с любым числом параметров. – Ehsan
Я добавил пример CachingProxy на основе класса ProxyBase , который кэширует вызовы. –
sisve
На основе документации MSDN метод GetHashCode не является надежным для создания уникального хеш-ключа, и если мы скажем, что мы должны реализовать этот метод для каждого типа, я думаю, что это также неверная практика http://msdn.microsoft.com/en- us/library/system.object.gethashcode.aspx строка 3 из раздела Замечания – Ehsan