2011-02-02 18 views
14

Tengo un código en mi aplicación que necesito ejecutar en cada solicitud, antes de que cualquier otra cosa ejecute (incluso antes de la autenticación). Hasta ahora he estado usando el evento Application_BeginRequest en mi Global.asax, y esto ha funcionado bien. Pero este código debe llegar a la base de datos, y hacer esto desde Global.asax no parece correcto por alguna razón. Además, el nuget Ninject.MVC3 que estoy utilizando no inyectará dependencias en mi ctt de HttpApplication.BeginRequest-like filter en MVC 3?

Entonces, lo que decidí hacer es mover este código a su propio filtro de acción global. El problema que estoy teniendo ahora es que no importa qué Order o FilterScope proporcione este filtro, no puedo hacer que se ejecute primero; mi filtro de autorización siempre lo supera. MSDN parece confirmar esto:

filtro de orden

Los filtros se ejecutan en el orden siguiente:

  1. filtros de autorización
  2. filtros de acción
  3. filtros de respuesta
  4. filtros de excepción

Por ejemplo, los filtros de autorización ejecutan primero y los filtros de excepción se ejecutan al final. Dentro de cada tipo de filtro, el valor Pedido especifica el orden de ejecución. Dentro de cada tipo de filtro y orden, el valor de enumeración del alcance especifica el orden para los filtros.

Sé que puedo utilizar un HttpModule, pero que no se siente muy MVCish, así que estoy tratando de agotar todas las posibilidades antes de ir por ese camino, que lleva a mi pregunta: ¿

Es Hay un equivalente BeginRequest para filtros de acción global?

Respuesta

16

Puede hacerlo en el método Initialize de un controlador base.

Otra posibilidad es registrar un global filter:

public class MyGlobalFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // that's gonna be hit 
    } 
} 

y en el caso de su RegisterGlobalFiltersGlobal.asax:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new MyGlobalFilter()); 
} 
+0

estoy usando DI, por lo que el nuevo operador está fuera :(Inicializar en un controlador base sí funcionó. Sin embargo, ser forzado a heredar de un tipo base parece un poco restrictivo, la razón por la que intenté lograr esto con filtros (o -solo más indeseablemente- módulos HTTP) es debido a su modularidad. –

+0

@Daniel, ¿qué le impide hacer 'filters.Add (DIContainer.Get ());' si no desea usar el operador 'new'? –

+0

no hay nada que me impida hacer eso. Pero preferiría no llamar directamente al contenedor, ya que sería la ubicación del servicio, no la inversión del control. Además, no me siento cómodo haciendo que mi código esté tan estrechamente vinculado a Ninject, así que estoy tratando de mantener mi kernel. Obtenga () al mínimo. –