【问题标题】:Setup filter attribute for dependency injection to accept params in constructor为依赖注入设置过滤器属性以接受构造函数中的参数
【发布时间】:2011-06-01 17:21:14
【问题描述】:

我正在关注page 上的 ninject 过滤器属性设置。

对他们来说,他们有:

.WithConstructorArgumentFromControllerAttribute<LogAttribute>(
      "logLevel", attribute => attribute.LogLevel);

第二个参数是Func&lt;LogAttribute, object&gt; callback。他们的实际参数列表设置如下:

Log(LogLevel = Level.Debug)

但我的过滤器属性设置如下:

public class AuthAttribute : FilterAttribute { }

public class AuthFilter : IAuthorizationFilter
{

    private readonly IUserService userService;
    private string[] roles;

    //Stuck on the constructor also. How do I accept params?
    public AuthFilter(IUserService userService, params string[] roles)
    {
        this.userService = userService;
        this.roles = roles;
    }
    public void OnAuthorization(AuthorizationContext filterContext)
    {
        throw new NotImplementedException();
    }
}

不知何故这是错误的。因为我希望我的过滤器看起来像:

[Auth("Admin", "Contrib")]

我的绑定:

 kernel.BindFilter<AuthFilter>(FilterScope.Controller, 0)
            .WhenControllerHas<AuthAttribute>()
            .WithConstructorArgumentFromControllerAttribute<AuthAttribute>("roles", /*Stuck here*/)

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 ninject


    【解决方案1】:

    您需要将角色设置为属性中的属性。

    属性:

    public class AuthAttribute : FilterAttribute 
    { 
      public string[] Roles { get; set; }
    
      public AuthAttribute(params string[] roles)
      {
          this.Roles = roles;
      }
    }
    

    过滤器:

    public class AuthFilter : IAuthorizationFilter
    {
    
      private readonly IUserService userService;
      private readonly string[] roles;
    
      public AuthFilter(IUserService userService, string[] roles)
      {
        this.userService = userService;
        this.roles = roles;
      }
    
      public void OnAuthorization(AuthorizationContext filterContext)
      {
        //do stuff
      }
    }
    

    控制器

       [AuthAttribute("a", "b")]
       public class YourController : Controller 
       {
    
       }
    

    绑定:

    kernel.BindFilter<AuthFilter>(FilterScope.Controller, 0)
                .WhenControllerHas<AuthAttribute>()
                .WithConstructorArgumentFromControllerAttribute<AuthAttribute>("roles", attribute => attribute.Roles);
    

    【讨论】:

    • 所以我从构造函数中删除了这个?
    • 我如何在OnAuthorization方法中访问它?
    • 感谢这项工作。如何设置控制器和动作的绑定?当我有另一个动作绑定时,它说找到了多个绑定。
    • @Lol coder...hmm,不确定问题可能是什么,ninject 文档有很好的示例说明如何设置两者。也许尝试发布一个不同的问题,有人可以提供更多帮助。
    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多