2010-12-16 16 views
5

Tengo una pregunta general sobre el mejor enfoque para autorizar elementos de la interfaz de usuario para Roles de aplicación. Lo que quiero decir es que un administrador puede ver botones, elementos de menú, etc., que un usuario normal no puede ver. ¿Cuál es la mejor práctica para esto?Autorización de elementos de la interfaz de usuario en .NET WinForms

Me doy cuenta de que podría haber varias pantallas basadas en Role (una pantalla de administrador, la misma pantalla duplicada para el usuario, etc.), que definitivamente parece exagerada. También deseo mantener Separation of Concern para que mi código de autorización no se entremezcle con la funcionalidad de visualización. En otras palabras, quiero evitar:

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

He estado buscando en los aspectos con PostSharp, que parece casi exactamente lo que quiero hacer, pero no parece extenderse lógicamente a la interfaz de usuario.

Estoy seguro de que me falta algo, ¿qué es?

Gracias -

Respuesta

5

parece probable que el código será finalmente compilar una lista de elementos de la interfaz de ocultar, o llevar a cabo una acción determinada para, a continuación, realizar las acciones basadas en el papel actual. Algo así como

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

Cómo compilar esa lista es principalmente lo que le interesa. Los marcos AOP definitivamente ayudan con la separación de preocupaciones, pero una solución casera no sería imposible. Estoy pensando en algo como:

  • Crear EnableForRoleAttribute, con el parámetro role.
  • Reflexione sobre sus formularios (posiblemente usando el reflejo para encontrar los formularios, o posiblemente proporcionándolos directamente a su código, o incluso encontrando formularios decorados con un RoleVaryingAttribute de su creación).
  • Refiérase a los campos de sus formularios, filtrando por instancias Control, luego por instancias Control con EnableForRoleAttribute.
  • ¡Ya tiene su lista! Establezca Enabled según el rol.

La lista con viñetas anterior es específica para su Enabled ejemplo, debido principalmente a atributos no se toman como parámetros de lambdas :(. Usted podría ser más flexible con una SetPropertyIfInRoleAttribute con parámetros role, propertyName y propertyValue. O tal . construcción

Básicamente, los marcos de AOP hacen que este trabajo sea más fácil para usted, y algunos, como PostSharp que esto ocurra en tiempo de compilación en lugar de tiempo de ejecución, pero la solución homebrew es bastante válida también

+0

Domenic -.. gracias, la SetPropertyIfInRoleAttribute (o SetPropertyByRole Atributo) parece un buen término medio, y a partir de este momento estoy inclinado de esa manera. Gran explicación, gracias por aclarar. Ahora veo, ¡lambda en un constructor de Atributo sería muy útil! – grefly

+0

Como seguimiento, lo que encontré con PostSharp fue que no pude obtener el atributo personalizado porque estoy decorando las clases .NET framework (cuadros de texto, etc.) en un nivel de instancia. Creo que me encontraré con el mismo problema otra vez. Aunque proporcionó una excelente respuesta a la pregunta original, una respuesta a menudo lleva a dos preguntas más ... = D – grefly

Cuestiones relacionadas