Как сохранить разрешение роли <-> в кэше для достижения наилучшего результата? - PullRequest
1 голос
/ 01 марта 2011

У меня есть таблица в БД с двумя столбцами, ролями и разрешениями , которая выглядит следующим образом:

роль - разрешение
пользователь - addItem
admin - removeItem
admin - расширенный поиск
гость - simpleSearch
пользователь - editItem
менеджер - editUser
... и т.д.

Мне нужно сохранить их в кэше .net, чтобы я мог проверить, существует ли разрешение для конкретной роли.

(вот псевдо-код)

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

Но как мне добавить и сохранить их в кеше для лучшего результата?

В PHP я бы сделал что-то вроде этого:

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

Есть ли эквивалентный или лучший / более быстрый способ в C #?

Спасибо!
/ Никлас

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Может быть что-то вроде 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);
    }
}
0 голосов
/ 01 марта 2011

Опираясь на ответ Маркса, вы можете использовать инициализаторы коллекций прямо в строке:

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, так как синтаксис очень похож.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...