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();
}
是的,我可以排序/重新排序。哈希集仍然是一组特权对象,我如何生成缓存键 - 哈希码? – EagerToLearn 2012-03-27 19:53:53
@EagerToLearn我认为这种策略可能取决于普通用户拥有多少特权(总共)。几个或几百? – hangy 2012-03-27 20:05:05