2011-03-01 3 views
1

나는 다음과 같다 두 개의 열, 역할권한으로 DB의 테이블을 가지고있다 - 허가
사용자 - addItem를
관리자 - removeItem
관리자최상의 결과를 얻으려면 캐시에 <-> 권한을 어떻게 저장합니까?

역할 - advancedSearch
손님 - simpleSearch
사용자 - 편집 항목
관리자 - 편집 사용자
... 등

특정 역할에 대한 권한이 있는지 확인할 수 있도록 .net의 캐시에 저장해야합니다.

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

(여기서 사이비 코드입니다)하지만 내가 어떻게 최상의 결과를위한 캐시에 추가하고 저장합니까? 나는 이런 식으로 뭔가를 할 거라고 PHP에서

는 것 같아요 :

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

는 C#에서/빠른 방법 동등하거나 더 나은 있습니까?

감사합니다.
/니클라스

답변

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); 
    } 
} 
+0

이것은 Marks의 대답과 같습니다. SqlDataReader에서 읽는 동안 반복적으로 추가해야합니다. 이 작업을 수행하기위한 올바른 구문은 무엇입니까? – Niklas

+0

@Niklas - 추가 할 것입니다 ... –

+0

스크립트, 로봇 또는 실제 인간 이건간에 ... 당신은 lives =를 저장하고 있습니다.) – Niklas

0

MARC를 응답에 건물, 직접 인라인 컬렉션 이니셜 라이저를 사용할 수 있습니다

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에서 배경 지식이 비교적 익숙해야합니다.

+0

감사합니다. 나는 두 개의 답을 표시 할 수 있었으면합니다. 그래서 "캐시"에 대한 역할 -> 권한을 추가하여 올바른 구문은 어떻게 생깁니 까? SQLdatareader에서 읽는 동안 반복적으로 추가해야합니다. – Niklas

+0

@ Niklas, 제 버전은 알려진 컴파일 타임 값을위한 것일 뿐이므로 유스 케이스에는별로 유용하지 않습니다.가능한 경우 DataReader를 사용하는 대신 SQL 대신 Linq와 같은 것을 살펴볼 것을 제안합니다. 그것은 당신의 인생을 훨씬 더 쉽게 만들어 줄 것입니다. –

관련 문제