2012-03-27 2 views
1

ASP.NET MVC 3 응용 프로그램을 코딩하고 있습니다. 탐색 메뉴는 하위 작업을 사용하여 사용자에게 설정된 권한에 따라 DB에서 동적으로 생성됩니다. 사용자는 Usergroups/Roles에 할당되지만 특정 특정 추가 사용 권한도 가질 수 있습니다. 현재 사용자에 대한 모든 권한에 대해 권한 부여 서비스가 반환하는 Hashset을 갖게됩니다. 대부분의 사용자는 usergroup과 동일한 권한을가집니다 (추가 권한 없음). 그래서, 내비게이션 메뉴를 캐싱하고 싶습니다.C# 다른 해시 집합에 대한 결과를 캐시하는 데 필요한 키

질문, 1. OutputCache 속성에 VaryByCustom 옵션을 사용해야합니까? 2. 같은 권한 집합을 가진 해시 테이블에 대해 고유 한 키를 어떻게 작성해야합니까 (다른 순서로 해시 세트에 추가 될 수 있음)?

답변

1

1. OutputCache 속성에 VaryByCustom 옵션을 사용해야합니까?

나는 그것이 최고의 버전이라고 생각합니다. here on SO 또는 in this blog을 참조하십시오.

2. 동일한 권한 집합 (다른 순서로 해시 세트에 추가 될 수 있음)을 갖는 해시 테이블에 대해 고유 키를 어떻게 작성해야합니까?

캐시 키를 구축하기 위해, 내가 과거에 이와 유사한 것을 사용했다 (a GetHashCode 구현을 사용) :

public class Permission 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public override int GetHashCode() { return this.Id.GetHashCode(); } 
} 

public static string BuildCacheKey(HashSet<Permission> permissions) 
{ 
    var hashCode = GetHashCode(permissions); 
    return string.Format(CultureInfo.InvariantCulture, "permission_{0}", hashCode); 
} 

private static int GetHashCode(IEnumerable<Permission> permissions) 
{ 
    unchecked 
    { 
     var hash = 17; 
     foreach (var permission in permissions.OrderBy(p => p.Id)) 
     { 
      hash = hash * 23 + permission.GetHashCode(); 
     } 

     return hash; 
    } 
} 

이 여러 권한 이럴와 함께 작동합니다. 몇 가지 권한 조합 만 있고 너무 복잡한 권한 이름이 아닌 경우 이름을 연결하면됩니다.

public static string BuildCacheKey(HashSet<Permission> permissions) 
{ 
    var builder = new StringBuilder("permission_"); 
    foreach (var permission in permissions.OrderBy(p => p.Name)) 
    { 
     builder.Append(permission.Name); 
    } 

    return builder.ToString(); 
} 
+0

예, 정렬/재주문 할 수 있습니다. Hashset은 여전히 ​​권한 개체 집합입니다. 캐시 키 - 해시 코드는 어떻게 생성합니까? – EagerToLearn

+0

@EagerToLearn이 전략은 일반 사용자의 권한 (총계)에 달려 있다고 생각합니다. 몇 백 ~ 몇백? – hangy

관련 문제