2010-12-16 7 views
5

응용 프로그램 역할의 UI 요소를 승인하는 최선의 방법에 대한 일반적인 질문이 있습니다. 내 말은 일반 사용자가 볼 수없는 버튼, 메뉴 항목 등을 관리자가 볼 수 있다는 것입니다. 이것에 대한 가장 좋은 방법은 무엇입니까?.NET WinForms의 UI 요소 승인

역할 (관리자 화면, 사용자가 중복 된 동일한 화면 등)을 기반으로하는 여러 개의 화면이있을 수 있음을 알고 있습니다. 이는 지나치게 과장된 것처럼 보입니다. 나는 또한 나의 인증 코드가 디스플레이 기능과 섞이지 않도록 우려의 분리 (Separation of Concern)를 유지하기를 원합니다. 나는 내가하고 싶은 정확히 거의 보인다 PostSharp와 측면에서 찾고있다

if(current_user.IsInRole("administrator")) 
    button.Enabled = true; 

하지만 논리적으로 UI를 확장하지 않는 것 : 즉, 나는 피하려고.

나는 뭔가를 놓치고 있다고 확신합니다. 무엇입니까?

감사합니다 - 당신의 코드가 결국 숨길 UI 요소의 목록을 컴파일, 나에게 주어진 작업을 수행 한 후 현재의 역할에 따라 해당 작업을 수행 할 것으로 보인다

답변

5

. 뭔가 같은

Dictionary<Control, Action<Control, string>> actions = new Dictionary<Control, Action<Control, string>> 
{ 
    { button, (c, r) => c.Enabled = (r == "administrator") }, 
    // etc. 
}; 

당신이 그 목록을 컴파일하는 방법은 주로 귀하의 질문과 관련이 있습니다. AOP 프레임 워크는 확실히 관심사 분리에 도움이되지만 자작 솔루션은 불가능하지 않습니다. 매개 변수 role으로,

  • EnableForRoleAttribute 만들기 : 내가 좋아하는 뭔가를 생각하고 있어요.
  • 리플렉션을 사용하여 양식을 찾거나 양식에 직접 제공하거나 직접 작성하여 RoleVaryingAttribute으로 장식 된 양식을 찾는 것).
  • 폼의 필드에 Control 인스턴스를 필터링하고 Control 인스턴스를 EnableForRoleAttribute으로 필터링하십시오.
  • 이제 목록이 있습니다. 역할에 따라 Enabled을 설정하십시오. 속성 :(매개 변수로 람다를 취할 수 없습니다. 당신은 매개 변수 role, propertyNameSetPropertyIfInRoleAttributepropertyValue. 또는 그러한 더 유연 할 수 주로하기 때문에

위의 글 머리 기호 목록, 당신의 Enabled 예에 따라 다릅니다 . 건설

기본적으로 AOP 프레임 워크는 쉽게 당신을 위해이 일을하고, PostSharp 같은 일부 대신 런타임의 컴파일시에 일어날 수 있도록하지만 사제 솔루션은 꽤 유효

+0

Domenic -.. 감사의 SetPropertyIfInRoleAttribute을 (또는 SetPropertyByRole 속성)은 좋은 중간 지대처럼 보이며,이 순간에 저는 그 방향으로 기울고 있습니다. 위대한 설명, 명확히 해줘서 고마워. 이제는 Attribute 생성자의 lambda가 매우 유용 할 것입니다. – grefly

+0

후속 조치로서, PostSharp를 사용하여 실행 한 것은 인스턴스 수준에서 .NET 프레임 워크 클래스 (텍스트 상자 등)를 꾸미므로 사용자 지정 특성을 얻을 수 없다는 것입니다. 나는 다시 같은 문제에 빠지게 될 것이라고 생각한다. 원래 질문에 대한 훌륭한 대답을 제공했지만 한 가지 대답으로 두 가지 질문이 더 많습니다. = D – grefly