Ninject and MVC3: Dependency injection to action filters

前端 未结 2 2080
小蘑菇
小蘑菇 2020-12-08 04:59

I\'ve found loads of inconclusive articles and questions on how to do property injection on an ActionFilter in ASP.NET MVC3 using Ninject.

Could someone give me a cl

相关标签:
2条回答
  • 2020-12-08 05:41

    In my opinion there is a better solution than using filter attributes. See my blogposts about an alternative way of declaring filters using Ninject. It does not require property injection and uses constructor injection instead:

    http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ http://www.planetgeek.ch/2011/02/22/ninject-mvc3-and-ninject-web-mvc3-merged-to-one-package/

    0 讨论(0)
  • 2020-12-08 05:46

    Here's how you could proceed:

    public class MvcApplication : Ninject.Web.Mvc.NinjectHttpApplication
    {
        private class MyModule : NinjectModule
        {
            public override void Load()
            {
                Bind<IService>().To<ServiceImpl>();
                Bind<IAuthenticationHelper>().To<AuthenticationHelperImpl>();
            }
        }
    
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapRoute(
                "Default",
                "{controller}/{action}/{id}",
                new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    
        protected override void OnApplicationStarted()
        {
            AreaRegistration.RegisterAllAreas();
    
            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    
        protected override IKernel CreateKernel()
        {
            var modules = new INinjectModule[] {
                new MyModule()
            };
            var kernel = new StandardKernel(modules);
            DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
            return kernel;        
        }
    }
    

    and then you could have your custom authorize attribute:

    public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        [Inject]
        public IService Service { get; set; }
    
        [Inject]
        public IAuthenticationHelper AuthenticationHelper { get; set; }
    
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
        }
    }
    

    and a controller action decorated with it:

    [CustomAuthorize]
    public ActionResult Index()
    {
        return View();
    }
    

    and the dependencies should be injected.

    0 讨论(0)
提交回复
热议问题