缓存服务电话

时间:2012-04-09 05:18:46

标签: c# .net caching distributed-caching

我想为缓存创建和Aspect。我需要知道如何从方法调用创建缓存键并将其插入缓存中并返回其值。有什么解决方案可供本部分使用。我不需要完整的缓存解决方案

由于

1 个答案:

答案 0 :(得分:0)

我之前使用RealProxy这种功能。我在博客文章中展示了一些例子; Intercepting method invocations using RealProxy

缓存代理的一个简单示例,使用方法的哈希代码(以确保具有相同参数的两个不同方法分别缓存)和参数。请注意,没有处理out-parameters,只处理返回值。 (如果要更改此值,则需要更改_cache以保存包含返回值和输出参数的对象。)此外,此实现没有形成av线程安全。

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;
    }
}