2012-03-27 74 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