2012-03-27 75 views
1

我正在編寫一個ASP.NET MVC 3應用程序。導航菜單是根據使用子動作爲用戶設置的權限從數據庫動態創建的。用戶分配給用戶組/角色,但他們也可以具有某些特定的附加權限。我有一個Hashset由授權服務返回當前用戶的所有權限。大部分用戶擁有與用戶組相同的權限(沒有額外的權限)。所以,我想緩存導航菜單。C#什麼應該是緩存不同哈希集結果的關鍵

問題, 1.我需要爲OutputCache屬性使用VaryByCustom選項? 2.我應該如何爲具有相同權限集的哈希表創建唯一鍵(可以按不同順序添加到哈希集)?

回答

1

1.我需要爲OutputCache屬性使用VaryByCustom選項?

我想這是最好的版本。請參閱here on SOin 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

是的,我可以排序/重新排序。哈希集仍然是一組特權對象,我如何生成緩存鍵 - 哈希碼? – EagerToLearn 2012-03-27 19:53:53

+0

@EagerToLearn我認爲這種策略可能取決於普通用戶擁有多少特權(總共)。幾個或幾百? – hangy 2012-03-27 20:05:05