我正在尝试CacheAttribute的PostSharp功能。
以下是我用来为每个缓存条目构建缓存密钥的方法。
private string BuildCacheKey(Arguments arguments)
{
var sb = new StringBuilder();
sb.Append(_methodName);
foreach (var argument in arguments.ToArray())
{
sb.Append(argument == null ? "_" : argument.ToString());
}
return sb.ToString();
}
以下是我使用的示例类。
class State
{
public string Code { get; set; }
public string Name { get; set; }
}
需要缓存的方法是:
[Cache]
private static IDictionary<string, string> GetStateRegions(IEnumerable<State> states)
{
//some db call here to retrieve values;
}
这就是我称之为方法的方式:
IList<State> states = new List<State>();
states.Add( new State {Code = "NM", Name = "New Mexico"});
states.Add(new State {Code = "CA", Name = "California"});
GetStateRegions(states);
BuildCacheKey方法构建以下缓存键 - “GetStateRegionsSystem.Collections.Generic.List`1 [ConsoleApplication1.State]”
我想建立一个类似“GetStateRegions [ConsoleApplication1.State]”的缓存键 - 例如上面的调用 - “GetStateRegionsNMCA [ConsoleApplication1.State]”用于状态代码NM和CA
实现这一目标的好方法是什么?也可以使用不同的逻辑来构建不同方法的键(基于方法参数类型)?非常感谢任何指针/建议。
答案 0 :(得分:1)
你将遇到的问题是你不知道参数是什么,除非你只是在一个方法上使用它。如果要更改密钥策略,可以在switch语句中使用MethodInfo.Name。您可能希望使用委托并在声明方面时指定密钥构建方法。
您可以尝试使用
if(Argument is List<State>)
{
//gen key based ons tates
} else
{
//gen key based on ToString()
}
您始终可以反映到参数中以获取值而不是ToString()
[serializable]
public class MyAspect : OnMethodBoundaryAspect
{
public MyKeyBuilderDelegate KeyBuildMethod;
...
}
然后声明方面如
[MyAspect(KeyBuilderMethod = BuildByState)]
public void MyMethod() { ... }