2011-07-20 7 views
5
tiempo

Tengo un atributo CustomAuthorize que comprueba si un usuario tiene acceso a la funcionalidad (un usuario o rol pueden estar asociados con elementos de un conjunto jerárquico de funciones).encargo Comprobación de parámetros atribuir al diseño/construcción

Para un método de acción determinada ...

[CustomAuthorize("Security.Admin.ManageWidgets.Update")] 

Esto funciona, pero me preocupa que los cambios en el objeto de Seguridad podrían causar problemas que no se detecta hasta que el tiempo de ejecución. Me doy cuenta de que puedo escribir pruebas unitarias para mitigar este riesgo, pero me gustaría saber si es posible verificar el parámetro del atributo en tiempo de compilación. También me gusta tener Intellisense ayúdame a escribir esta expresión.

Idealmente, podría pasar una expresión lambda.

[CustomAuthorize(i => i.Admin.ManageWidgets.Update)] 

Desafortunadamente esto is not currently possible (additional info from Microsoft).

También probé encapsular la expresión esperanza de que será evaluado y luego se pasa al atributo como una cadena, pero esto tampoco logró compilar con el mismo error (La expresión no puede contener métodos anónimos o expresiones lambda).

[CustomAuthorize(LambdaToString(i => i.Admin.ManageWidgets.Update))] 

¿Cómo puedo añadir un poco de tiempo de diseño/construcción-tiempo de soporte para mi atributo personalizado parámetros?

+0

1 para un problema interesante. – Mrchief

Respuesta

1

Puede utilizar T4 templates para crear clases personalizadas con propiedades de cadena, para terminar con un código similar al de Bennym, pero se genera automáticamente.

+0

Esto podría me han puesto en el camino correcto - mi objeto de Seguridad ya se genera automáticamente y se puede añadir una constante a cada clase/subclase que tiene el nombre completo. No es exactamente verificar que la secuencia esté bien, pero dado que se genera automáticamente, puedo hacer esa suposición de manera segura (y me hago intellisense). – Mayo

3

una clase estática con constantes.

public static class Rights 
{ 
    public const string UpdateWidgets = "UpdateWidgets"; 
} 

incluyen también unittests de los métodos que están decoradas con ellos y que va a ser bastante bueno.

[CustomAuthorize(Rights.UpdateWidgets)] 
1

No, no puede comprobar este tipo de cosas en tiempo de compilación - el mejor que se puede esperar es un paso posterior a la generación que comprueba esto a través de la reflexión.

en su lugar podría suministrar un tipo y un nombre de método, de esta manera:

[CustomAuthorize(typeof(Security.Admin.ManageWidgets), "Update")] 

Pero ya que usted todavía tiene que escribir el nombre del método de su discutible qué beneficio que esto realmente se gana.