2011-04-26 61 views
6

你好,我试图实现一个带注入的全局过滤器。 过滤器看起来像这样。ASP.NET MVC 3和全局过滤器注入

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(); 
    } 
} 

而且我已经在我的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)); 
      } 
     } 

但由于某种原因,应用程序运行时过滤器永远不会被触发,我没有正确实现它吗?

回答

7

我会使用~/App_Start/NinjectMVC3.cs文件来配置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); 
     } 
    } 
} 

,并在Global.asax保持不变。顺便说一下,这是安装Ninject.MVC3 NuGet程序包时的默认设置。

+0

即使这个工作,我仍然想知道为什么他的原始解决方案没有。 – BigOmega 2014-03-20 17:51:17

+2

@Darin如果您通过ninject添加了过滤器,是否意味着您无需在FilterConfig.RegisterGlobalFilters(GlobalFilterCollection过滤器)中注册此过滤器? – Haroon 2014-12-06 20:57:26