ASP.NET MVC3 + ActionFilterAttribute +注入?

嘿那里,我已经成功地在我的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; } // ... } 

在这种情况下,可以使用构造函数注入,但您需要使用属性/filter组合。

您的filter(例如: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容器将属性绑定到filter:

 // controller-level kernel.BindFilter(FilterScope.Controller, 0).WhenControllerHas() // action level kernel.BindFilter(FilterScope.Action, 0).WhenActionMethodHas(); 

看到:

asp.net mvc的Ninject和Filter属性的dependency injection

使用构造函数参数过滤的Ninject绑定属性

https://github.com/ninject/ninject.web.mvc/wiki/Filter-configurations

我想要克服的技巧是如何将我的角色定义在属性上的filter… ninject文档应该有所帮助,但我自己还没有。

祝好运。