Ninject与MVC3:将依赖注入到操作过滤器中

20

我在stackoverflow上找到了很多关于如何在ASP.NET MVC3中使用Ninject进行ActionFilter属性注入的不确定文章和问题。

有人能给我一个清晰的例子吗?

这是我的自定义认证属性。

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    [Inject]
    public IService Service { get; set; }

    [Inject]
    public IAuthenticationHelper AuthenticationHelper { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
         //My custom code
    }
 }

我正在使用WebActivator来设置Ninject

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyProject.Web.AppStart_NinjectMvc3), "Start")]

 namespace MyProject.Web {

   public static class AppStart_NinjectMvc3 {
        public static void RegisterServices(IKernel kernel) {

           //Binding things
    }

    public static void Start() {
        // Create Ninject DI Kernel 
        IKernel kernel = new StandardKernel();

        // Register services with our Ninject DI Container
        RegisterServices(kernel);

        // Tell ASP.NET MVC 3 to use our Ninject DI Container 
        DependencyResolver.SetResolver(new NinjectServiceLocator(kernel));
    }

  }
}

我的服务和辅助类从未被注入。我需要改变什么?

2个回答

14

8

以下是您可以进行的步骤:

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

然后,您可以拥有自定义的授权属性:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    [Inject]
    public IService Service { get; set; }

    [Inject]
    public IAuthenticationHelper AuthenticationHelper { get; set; }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
    }
}

以及使用该装饰器修饰的控制器操作:

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

依赖项应该被注入。


1
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); - 这行代码不是必需的。NinjectHTTPApplication 在 Application_Start 中注册了 DependencyResolver - LukLed
3
有点烦人的是,Ninject开发了自己的做事方式,直接与微软的努力相矛盾,但这确实起作用了。谢谢。 - Rob Stevenson-Leggett
非常感谢,这非常有帮助。 - sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接