Castle Core Invocation根据截获的方法创建缓存键

时间:2016-09-16 21:40:05

标签: caching castle-dynamicproxy invocation

我使用接口拦截器来缓存所有以" Get"但是我无法弄清楚如何为每个未知参数生成一个唯一的缓存键,它可以是任何东西,并且使用GetHashCode不是一个选项,因为我无法100%确定它们已经覆盖了GetHashCode。 / p>

How can I create a unique hashcode for a JObject?

中有些想法

其中JSON用于JObject我正在考虑JSON序列化每个参数然后获取哈希代码,如上面链接中所述:

var obj = JToken.Parse(jsonString);
var comparer = new JTokenEqualityComparer();
var hashCode = comparer.GetHashCode(obj);

但是我认为这将是一次表演,所以如何才能解决这个问题?

我到目前为止的代码是这样的,但它不会处理复杂的类型情况,其中.ToString不会生成原始值类型,如int,string等。

private string CreateCacheKey(IInvocation invocation)
{
    string className = invocation.TargetType.FullName;
    string methodName = invocation.Method.Name;

    var builder = new StringBuilder(100);
    builder.Append(className);
    builder.Append(".");
    builder.Append(methodName);

    for (int i = 0; i < invocation.Arguments.Length; i++)
    {
        var argument = invocation.Arguments[i];
        var argumentValue = invocation.GetArgumentValue(i);
        builder.Append("_");
        builder.Append(argument);

        if (argument != argumentValue)
        {
            builder.Append(argumentValue);
        }
    }

    return string.Format("{0}-{1}", this.provider.CacheKey, builder);
}

1 个答案:

答案 0 :(得分:0)

我最终使用了GetHashCode,因为它是唯一可行的解​​决方案,如果它不会覆盖它不会缓存的方法。