Asp.net-Mvc

為依賴注入設置過濾器屬性以接受建構子中的參數

  • November 30, 2011

我正在關注此頁面上的 ninject 過濾器屬性設置。

對他們來說,他們有:

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

第二個參數期望一個Func<LogAttribute, object> 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*/)

您需要將角色變成屬性中的屬性。

屬性:

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

引用自:https://stackoverflow.com/questions/6205187