2011-06-15 30 views
7

我使用asp.net mvc 3,ninject 2.0和ninject mvc 3插件。如何使用Ninject将服务注入授权过滤器?

我想知道如何获得服务图层到我的过滤器(在这种情况下是授权过滤器?)。

我喜欢做构造函数注入所以这是可能的还是我必须注入属性?

感谢

编辑

我有这个财产注入,但我的财产总是空

[Inject] 
     public IAccountService AccountServiceHelper { get; set; } 


     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      // check if context is set 
      if (httpContext == null) 
      { 
       throw new ArgumentNullException("httpContext"); 
      } 

      // check if user is authenticated 
      if (httpContext.User.Identity.IsAuthenticated == true) 
      { 
       // stuff here 
       return true; 
      } 

      return false; 
     } 



    /// <summary> 
    /// Application_Start 
    /// </summary> 
    protected void Application_Start() 
    { 

     // Hook our DI stuff when application starts 
     IKernel kernel = SetupDependencyInjection(); 

     RegisterMaps.Register(); 

     AreaRegistration.RegisterAllAreas(); 

     RegisterGlobalFilters(GlobalFilters.Filters); 
     RegisterRoutes(RouteTable.Routes); 

    } 


    public IKernel SetupDependencyInjection() 
    { 
     IKernel kernel = CreateKernel(); 
     // Tell ASP.NET MVC 3 to use our Ninject DI Container 
     DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel)); 

     return kernel; 
    } 

    protected IKernel CreateKernel() 
    { 
     var modules = new INinjectModule[] 
          { 
          new NhibernateModule(), 
          new ServiceModule(), 
          new RepoModule() 
          }; 

     return new StandardKernel(modules); 
    } 


public class ServiceModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IAccountService>().To<AccountService>(); 
    } 

} 

编辑

我升级到ninject 2.2并得到终于得偿所愿工作。

编辑2

我要试图为我的授权过滤器做的构造方式,但我不确定如何在角色通过。我猜我必须通过ninject完成它?

编辑3

这是我迄今为止

public class MyAuthorizeAttribute : AuthorizeAttribute 
    { 
     private readonly IAccountService accountService; 

     public MyAuthorizeAttribute(IAccountService accountService) 
     { 
      this.accountService = accountService; 
     } 

     protected override bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      return base.AuthorizeCore(httpContext); 
     } 
    } 

    this.BindFilter<MyAuthorizeAttribute>(FilterScope.Controller, 0) 
       .WhenControllerHas<MyAuthorizeAttribute>(); 

    [MyAuthorize] 
    public class MyController : BaseController 
    { 
} 

它告诉我,它想是一个无参数的构造函数。所以我必须错过一些东西。

回答

11

过滤器的问题是它们是属性。如果你定义了一个需要依赖的属性的构造函数,你将永远无法将它应用于任何方法:因为所有传递给属性的值都必须在编译时知道。

所以基本上你有两种可能性:

  1. 使用Ninject应用过滤器在全球范围,而不是用它装饰您的控制器/动作:

    public interface IFoo { } 
    public class Foo : IFoo { } 
    
    public class MyFooFilter : AuthorizeAttribute 
    { 
        public MyFooFilter(IFoo foo) 
        { 
    
        } 
    } 
    

    ,然后配置内核:

    kernel.Bind<IFoo>().To<Foo>(); 
    kernel.BindFilter<MyFooFilter>(FilterScope.Action, 0).When(
        (controllerContext, actionDescriptor) => 
         string.Equals(
          controllerContext.RouteData.GetRequiredString("controller"), 
          "home", 
          StringComparison.OrdinalIgnoreCase 
         ) 
    ); 
    
  2. 使用属性注入:

    public interface IFoo { } 
    public class Foo : IFoo { } 
    
    public class MyFooFilter : AuthorizeAttribute 
    { 
        [Inject] 
        public IFoo Foo { get; set; } 
    } 
    

    ,然后配置内核:

    kernel.Bind<IFoo>().To<Foo>(); 
    

    ,并与您的自定义过滤器装饰一些控制器/动作:

    [MyFooFilter] 
    public ActionResult Index() 
    { 
        return View(); 
    } 
    
+0

@Darin季米特洛夫 - 我想我会尝试注入财产。我遇到问题了。我会更新我的帖子。 – chobo2 2011-06-15 20:49:19

+0

@ chobo2,看看我提供的有关您拥有的两种可能性的示例。 – 2011-06-15 20:55:38

+0

@Darin Dimitrov-我一直在阅读 - > http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/,他们似乎再次推荐属性注入,因为它是向后兼容的,我猜将来会被取代。如果我使用选项1.属性标记在控制器/操作方法上的外观如何。如果我继续进行财产注入,我错过了什么,因为我似乎拥有你的财产,但我的财产为空。我知道绑定工程因为我使用绑定在构造函数注入,它不是null。 – chobo2 2011-06-15 20:57:20

相关问题