2011-06-10 4 views
1

CacheAttribute 기능이 PostSharp입니다.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(); 
    } 

다음은 내가 사용하는 샘플 클래스입니다.

[Cache] 
    private static IDictionary<string, string> GetStateRegions(IEnumerable<State> states) 
    { 
     //some db call here to retrieve values; 
    } 

그리고 이것은 내가 메서드를 호출하는 방법입니다 :

class State 
{ 
    public string Code { get; set; } 
    public string Name { get; set; } 
} 

그리고 캐시 할 필요가있는 방법

 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

당신이 가지고있는 문제는 당신이 단 하나의 방법으로 만 이것을 사용하고있는 것이 아니라면 논증이 무엇인지 알지 못한다는 것입니다. 키 stratgey를 변경하려는 경우 Switch 문에서 MethodInfo.Name을 사용할 수 있습니다. 애스펙트를 선언 할 때 델리게이트를 사용하고 키 빌드 방법을 지정하고자 할 수 있습니다.

당신은

[serializable] 
public class MyAspect : OnMethodBoundaryAspect 
{ 
    public MyKeyBuilderDelegate KeyBuildMethod; 

    ... 
} 

다음

[MyAspect(KeyBuilderMethod = BuildByState)] 
public void MyMethod() { ... } 
+0

그는 같은 측면을 선언하는 대신 ToString()의 값을 얻기 위해 당신은 항상 인수에 반영 할 수

if(Argument is List<State>) { //gen key based ons tates } else { //gen key based on ToString() } 

사용해 볼 수 있습니다 목록 유형 또는 ICollection –

+0

을 확인해야합니다. 방금 변경했습니다. –

+0

나는 그것을 발사하고 그것이 효과가 있는지 볼 것이다. – muruge