[英]ASP.NET MVC3 + ActionFilterAttribute + Injection?
嘿那里,我已經成功地在我的FilterAttribute中使用了屬性注入,但是我想知道它是否可以將它移動到構造函數中呢?
我目前的代碼:
// AuthAttribute.cs
public class AuthAttribute : ActionFilterAttribute
{
public Roles _authRoles { get; private set; }
[Inject]
private readonly IAuthorizationService _service;
public AuthAttribute(Roles roles)
{
_authRoles = roles;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
string redirectOnSuccess = filterContext.HttpContext.Request.Url.AbsolutePath;
string redirectUrl = string.Format("?returnUrl={0}", redirectOnSuccess);
string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
filterContext.HttpContext.Response.Redirect(loginUrl, true);
}
else
{
bool isAuthorized = _service.Authorize(GetUserSession.Id, _authRoles.ToString());
if (!isAuthorized)
{
// TODO: Make custom "Not Authorized" error page.
throw new UnauthorizedAccessException("No access");
}
}
}
}
// TestController.cs
[Auth(Roles.Developer)]
public ActionResult Index()
{
// Some smart logic
}
提前致謝!
不,這是不可能的,因為構造函數的參數必須是簡單類型 。
出於測試目的,您可以使用另一個構造函數(因為您不應該使用帶有測試的IoC容器):
public class AuthAttribute : ActionFilterAttribute
{
public Roles _authRoles { get; private set; }
[Inject]
private readonly IAuthorizationService _service;
public AuthAttribute(Roles roles)
{
_authRoles = roles;
}
public AuthAttribute(Roles roles, IAuthorizationService authSvc)
: this(roles)
{
this.service = authSvc;
}
// ...
}
構造函數注入有可能在這種情況下,但你需要使用屬性/過濾器組合。
您的過濾器(例如:IAuthorizationFilter)實現將使用構造函數注入並完成所有工作...
您的屬性(例如:FilterAttribute)將很薄,主要用於裝飾您的控制器或操作。
public class AuthorizationFilter : IAuthorizationFilter
{
private readonly IAuthorizationService _authorizationService;
private readonly UserRoles _requiredRoles; // Enum of Roles
public AuthorizationFilter(IAuthorizationService authorizationService, UserRoles requiredRoles)
{
_authorizationService = authorizationService;
_requiredRoles = requiredRoles;
}
public void OnAuthorization(AuthorizationContext filterContext)
{
// do work, or HandleUnauthorizedRequest()
}
protected void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
// do work
}
}
public class RequireRolesAttribute : FilterAttribute
{
public readonly UserRoles RequiredRoles;
public RequireRolesAttribute(UserRoles requiredRoles)
{
RequiredRoles = requiredRoles;
}
}
然后你的Ninject容器將屬性綁定到過濾器:
// controller-level
kernel.BindFilter<AuthorizationFilter>(FilterScope.Controller, 0).WhenControllerHas<RequireRolesAttribute>()
// action level
kernel.BindFilter<AuthorizationFilter>(FilterScope.Action, 0).WhenActionMethodHas<RequireRolesAttribute>();
看到:
asp.net mvc的Ninject和Filter屬性的依賴注入
https://github.com/ninject/ninject.web.mvc/wiki/Filter-configurations
我想要克服的技巧是如何將我的角色定義在屬性上的過濾器... ninject文檔應該有所幫助,但我自己還沒有。
祝好運。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.