2011-06-10 60 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