PostSharp - 动态缓存密钥

时间:2011-06-10 22:44:46

标签: aop postsharp

我正在尝试CacheAttributePostSharp功能。

以下是我用来为每个缓存条目构建缓存密钥的方法。

    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

实现这一目标的好方法是什么?也可以使用不同的逻辑来构建不同方法的键(基于方法参数类型)?非常感谢任何指针/建议。

1 个答案:

答案 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() { ... }