2011-06-10 25 views
1

我在尝试PostSharpCacheAttribute功能。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.

什么是实现这一目标的好方法?也有可能使用不同的逻辑来为不同的方法构建密钥(基于方法参数类型)?将不胜感激任何指针/建议。

回答

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() { ... } 
+0

他需要检查一种列表或者ICollection – 2011-06-10 23:16:16

+0

是的,我只是改变了它 – 2011-06-10 23:16:32

+0

我会给它一个镜头,看看是否有效。 – muruge 2011-06-10 23:38:36