Castle 核心调用从拦截的方法中创建一个缓存键
Castle Core Invocation create a cache key from intercepted method
我正在使用接口拦截器来缓存所有以 "Get" 开头的方法,但我不知道如何为每个未知参数生成唯一的缓存键,它可以是任何东西,使用 GetHashCode 是不是一个选项,因为我不能 100% 确定他们已经覆盖了 GetHashCode。
一些想法与
一致
其中 JSON 用于我正在考虑的 JObject JSON 序列化每个参数然后获取哈希码,如上面 link 中所述:
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);
}
我最终使用了 GetHashCode,因为如果不重写它不会缓存的方法,它是唯一可行的解决方案。
我正在使用接口拦截器来缓存所有以 "Get" 开头的方法,但我不知道如何为每个未知参数生成唯一的缓存键,它可以是任何东西,使用 GetHashCode 是不是一个选项,因为我不能 100% 确定他们已经覆盖了 GetHashCode。
一些想法与
其中 JSON 用于我正在考虑的 JObject JSON 序列化每个参数然后获取哈希码,如上面 link 中所述:
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);
}
我最终使用了 GetHashCode,因为如果不重写它不会缓存的方法,它是唯一可行的解决方案。