2010-12-16 11 views
5

Ich habe eine allgemeine Frage über den besten Ansatz für die Autorisierung von UI-Elementen für Anwendungsrollen. Was ich meine, ist, dass ein Administrator Tasten, Menüpunkte usw. sehen kann, die ein normaler Benutzer nicht sehen kann. Was ist die beste Vorgehensweise dafür?Autorisierung von UI-Elementen in .NET WinForms

Ich realisiere, dass es mehrere Bildschirme basierend auf der Rolle (ein Admin-Bildschirm, der gleiche Bildschirm für den Benutzer dupliziert, etc.), die auf jeden Fall wie Overkill scheint. Ich möchte auch die Trennung von Bedenken beibehalten, damit mein Autorisierungscode nicht mit der Anzeigefunktionalität vermischt wird. Mit anderen Worten, ich möchte vermeiden:

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

Ich habe auf Aspekte mit Postsharp suchen, die genau fast scheint, was ich tun will, aber es scheint nicht logisch mit dem UI zu erweitern.

Ich bin sicher, ich vermisse etwas, was ist das?

Dank -

Antwort

5

Es dass Ihr Code wahrscheinlich scheint schließlich eine Liste von UI-Elementen kompilieren eine bestimmte Aktion auf, sich zu verstecken, oder durchführen und dann die Aktionen auf der Grundlage der aktuellen Rolle ausführen. Etwas wie

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

Wie Sie diese Liste kompilieren ist in erster Linie, was Ihre Frage betrifft. AOP-Frameworks helfen definitiv bei der Trennung von Bedenken, aber eine Homebrew-Lösung wäre nicht unmöglich. Ich denke, so etwas wie:

  • Ein EnableForRoleAttribute, mit dem Parameter role.
  • Denken Sie über Ihre Formulare nach (möglicherweise mithilfe von Reflektion, um die Formulare zu finden oder sie möglicherweise direkt Ihrem Code zur Verfügung zu stellen oder sogar Formulare zu finden, die mit einem RoleVaryingAttribute Ihrer Kreation verziert sind).
  • Reflektieren Sie die Felder Ihrer Formulare, Filtern für Control Instanzen, dann für Control Instanzen mit der EnableForRoleAttribute.
  • Jetzt haben Sie Ihre Liste! Stellen Sie basierend auf der Rolle Enabled ein.

Die obige Aufzählung ist spezifisch für Ihr Enabled Beispiel, vor allem, weil Attribute nicht lambdas als Parameter übernehmen können :(. Sie könnten flexibler mit einem SetPropertyIfInRoleAttribute mit Parametern role, propertyName und propertyValue. Oder solche . Bau

Grundsätzlich macht das AOP-Frameworks diese Arbeit einfacher für Sie, und einige, wie Postsharp es bei der Kompilierung statt Laufzeit Aber die Homebrew-Lösung ist ziemlich gültig passieren

+0

Domenic -.. dank der SetPropertyIfInRoleAttribute (oder SetPropertyByRole Attribut) scheint ein guter Mittelweg zu sein, und von diesem Moment an stütze ich mich auf diesen Weg. Große Erklärung, danke für die Klärung. Jetzt sehe ich, Lambda in einem Attribut-Konstruktor wäre sehr nützlich! – grefly

+0

Als Folge, was ich bei der Verwendung von PostSharp lief, war, dass ich das benutzerdefinierte Attribut nicht bekommen konnte, weil ich .NET-Framework-Klassen (Textfelder usw.) auf einer Instanz-Ebene verzieren. Ich denke, ich werde wieder auf das gleiche Problem stoßen. Obwohl Sie eine gute Antwort auf die ursprüngliche Frage gegeben haben, führt eine Antwort oft zu zwei weiteren Fragen ... = D – grefly

Verwandte Themen