【问题标题】:Caching service call缓存服务调用
【发布时间】:2012-04-21 14:09:39
【问题描述】:

我想为缓存创建 Aspect。我需要知道如何从方法调用中创建缓存键并将其插入缓存并返回值。是否有任何解决方案可用于这部分。我不需要完整的缓存解决方案

谢谢

【问题讨论】:

    标签: c# .net caching distributed-caching


    【解决方案1】:

    我以前使用过RealProxy 来实现这种类型的功能。我在博客文章中展示了一些示例; Intercepting method invocations using RealProxy

    缓存代理的快速示例,使用方法的哈希码(以确保具有相同参数的两个不同方法分别缓存)和参数。请注意,没有处理输出参数,只有返回值。 (如果您想更改它,您需要更改 _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;
        }
    }
    

    【讨论】:

    • 我想你没有得到问题,我需要知道是否有一个解决方案来创建一个表示方法调用及其返回值的缓存键(字符串)。例如缓存 SomeMethod(param1, param2),但寻找能够缓存具有任意数量参数的任何方法的通用解决方案
    • 我添加了一个示例 CachingProxy,它基于 ProxyBase 类,用于缓存调用。
    • 基于 MSDN 文档 GetHashCode 方法对于创建唯一哈希键是不可靠的,如果我们说我们应该为每个 Type 实现这个方法,我认为这也是一个不好的做法 msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx line 3备注部分
    • 我正在寻找您的 sn-p 代码中 GetMethodCallHashCode 方法的可靠实现,谢谢
    • 您可以将整个代码 sn-p 重写为实际使用参数作为键,并遍历所有缓存项并调用 Equals 以验证它是否是相同的参数。类似于 IDictionary> 和 IEqualityComparer 的东西,它同时处理 GetHashCode 和 Equals。
    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    相关资源
    最近更新 更多