如何在缓存中存储角色< - >权限以获得最佳结果?

时间:2011-03-01 10:19:43

标签: .net arrays caching

我在数据库中有一个表格,其中有两列,角色权限,如下所示:

角色 - 权限
user - addItem
admin - removeItem
admin - 高级搜索
客人 - simpleSearch
user - editItem
经理 - editUser
...等

我需要将它们存储在.net的缓存中,以便我可以检查特定角色是否存在权限。

(这是伪代码)

if ("permission" is in Cache["role"]) // Authorize access

但是如何在缓存中添加和存储它们以获得最佳效果?

在PHP中我会做这样的事情我猜:

array ( "user"  => array ( "addItem", "editItem"),
        "admin"  => array ( "removeItem", "advancedSearch"),
         ....

C#中是否存在等效或更好/更快的方式?

谢谢!
/尼古拉斯

2 个答案:

答案 0 :(得分:1)

也许像Dictionary<string, HashSet<string>>

例如:

var pairs = new[] { 
    new{Role="user",Permission="addItem"},
    new{Role="admin",Permission="removeItem"},
    new{Role="admin",Permission="advancedSearch"},
    new{Role="guest",Permission="simpleSearch"},
    new{Role="user",Permission="addItem"},
    new{Role="manager",Permission="editUser"},
};
Dictionary<string, HashSet<string>> cache = pairs.GroupBy(pair => pair.Role)
    .ToDictionary(grp => grp.Key, grp => new HashSet<string>(
          grp.Select(g => g.Permission)));
cache["user"].Contains("addItem");

或者如果从数据阅读器中读取(评论):

var cache = new Dictionary<string, HashSet<string>>();
using (var reader = GetReader()) {
    while (reader.Read()){
        string role = reader.GetString(0),
            permission = reader.GetString(1);
        HashSet<string> permissions;
        if (!cache.TryGetValue(role, out permissions)){
            cache.Add(role, permissions = new HashSet<string>());
        }
        permissions.Add(permission);
    }
}

答案 1 :(得分:0)

在Marcs答案的基础上,您可以直接使用集合初始值设定项:

var cache = new Dictionary<string, HashSet<string>>()
    {
        { "user", new HashSet<string>() { "addItem" } },
        { "admin", new HashSet<string>() { "removeItem", "advancedSearch" } },
        { "guest", new HashSet<string>() { "simpleSearch" } }
    };

看起来比LINQ版本更清晰,并且对于PHP的背景应该比较熟悉,因为语法非常相似。