2012-03-27 9 views
1

私はASP.NET MVC 3アプリケーションをコーディングしています。ナビゲーションメニューは、子アクションを使用して、ユーザーに設定された権限に基づいてDBから動的に作成されます。ユーザーはUsergroups/Rolesに割り当てられますが、特定の特定の追加のアクセス許可を持つこともできます。私は、現在のユーザーのすべての権限に対して、認可サービスからハッシュセットを返すようにしています。ほとんどのユーザーは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

はい、並べ替え/並べ替えができます。ハッシュセットは依然として特権オブジェクトのセットですが、キャッシュキー(Hashcode)を生成するにはどうすればいいですか? – EagerToLearn

+0

@EagerToLearn私は、その戦略は、通常のユーザーが持つ権限の数(合計)によって異なると考えています。数百または数百? – hangy

関連する問題