2011-04-26 17 views
6

Hola, estoy tratando de implementar un filtro global con inyección. El filtro tiene este aspecto.ASP.NET MVC 3 e inyección de filtro global

public class WikiFilter : IActionFilter 
{ 
    private IWikiService service; 

    public WikiFilter(IWikiService service) 
    { 
     this.service = service; 
    } 

    public void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     !!!Code here!! 
    } 

    public void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Y he adjuntado el filtro con la inyección de la siguiente manera en mi Global.asax.

 public class MvcApplication : System.Web.HttpApplication, 
     IAuthenticationApplication<User> 
     { 
      protected void Application_Start() 
      { 
       Ninject(); 
       AreaRegistration.RegisterAllAreas(); 
       RegisterRoutes(RouteTable.Routes); 
       RegisterGlobalFilters(GlobalFilters.Filters); 
      } 

      private void Ninject() 
      { 
       // Create Ninject DI kernel 
       IKernel kernel = new StandardKernel(); 

       kernel.Bind<DataContext>().ToSelf().InRequestScope(); 
       kernel.Bind<IWikiRepository>().To<WikiRepository>(); 
       kernel.Bind<IWikiService>().To<WikiService>(); 

       // Global filters 
       kernel.BindFilter<WikiFilter>(FilterScope.Global, 0); 

       DependencyResolver.SetResolver 
        (new NinjectDependencyResolver(kernel)); 
      } 
     } 

Pero por alguna razón el filtro nunca se dispara cuando se ejecuta la aplicación, ¿no lo he implementado correctamente?

Respuesta

7

le recomiendo que utiliza el archivo ~/App_Start/NinjectMVC3.cs para configurar el kernel Ninject:

[assembly: WebActivator.PreApplicationStartMethod(typeof(AppName.App_Start.NinjectMVC3), "Start")] 
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(AppName.App_Start.NinjectMVC3), "Stop")] 

namespace AppName.App_Start 
{ 
    using System.Web.Mvc; 
    using Microsoft.Web.Infrastructure.DynamicModuleHelper; 
    using Ninject; 
    using Ninject.Web.Mvc; 
    using Ninject.Web.Mvc.FilterBindingSyntax; 

    public static class NinjectMVC3 
    { 
     private static readonly Bootstrapper bootstrapper = new Bootstrapper(); 

     /// <summary> 
     /// Starts the application 
     /// </summary> 
     public static void Start() 
     { 
      DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule)); 
      bootstrapper.Initialize(CreateKernel); 
     } 

     /// <summary> 
     /// Stops the application. 
     /// </summary> 
     public static void Stop() 
     { 
      bootstrapper.ShutDown(); 
     } 

     /// <summary> 
     /// Creates the kernel that will manage your application. 
     /// </summary> 
     /// <returns>The created kernel.</returns> 
     private static IKernel CreateKernel() 
     { 
      var kernel = new StandardKernel(); 
      RegisterServices(kernel); 
      return kernel; 
     } 


     /// <summary> 
     /// Load your modules or register your services here! 
     /// </summary> 
     /// <param name="kernel">The kernel.</param> 
     private static void RegisterServices(IKernel kernel) 
     { 
      kernel.Bind<DataContext>().ToSelf().InRequestScope(); 
      kernel.Bind<IWikiRepository>().To<WikiRepository>(); 
      kernel.Bind<IWikiService>().To<WikiService>(); 
      kernel.BindFilter<WikiFilter>(FilterScope.Global, 0); 
     } 
    } 
} 

y el Global.asax se mantiene sin cambios. Por cierto, esa es la configuración predeterminada cuando instala el paquete Nuject de Ninject.MVC3.

+0

Incluso si esto funcionó, todavía me pregunto por qué su solución original no lo hizo. – BigOmega

+2

@Darin si agregó el filtro mediante ninject, ¿significa eso que no necesita registrar este filtro en FilterConfig.RegisterGlobalFilters (filtros GlobalFilterCollection)? – Haroon

Cuestiones relacionadas