asp.net-mvc-3 - Ninject 绑定(bind)属性以使用构造函数参数进行过滤

标签 asp.net-mvc-3 dependency-injection attributes filter ninject

我为此阅读了尽可能多的答案,但它们似乎缺少一个细节。

问题是当将 Action 过滤器(通过 Controller 注入(inject)的服务)绑定(bind)到相应的属性时,我无法弄清楚如何将参数/属性值从属性传递到其绑定(bind)过滤器。下面是代码,下面是我想要的假代码:

过滤器和属性

public class AuthorizationFilter : IAuthorizationFilter
{
    private readonly IAuthorizationService _authorizationService;
    private readonly UserRoles _requiredRoles;   // Enum

    public AuthorizationFilter(IAuthorizationService authorizationService, UserRoles requiredRoles)
    {
        _authorizationService = authorizationService;
        _requiredRoles = requiredRoles;
    }

    public void OnAuthorization(AuthorizationContext filterContext)
    {
        if (filterContext.HttpContext.Session == null)
            HandleUnauthorizedRequest(filterContext);
        else {
            var authorized = _authorizationService.IsUserInRole((UserSessionInfoViewModel) filterContext.HttpContext.Session["user"], _requiredRoles);
            if (!authorized)
                HandleUnauthorizedRequest(filterContext);
            // else TODO: deal with cache... 
        }
    }
}

public class RequireRolesAttribute : FilterAttribute
{
    public readonly UserRoles RequiredRoles;

    public RequireRolesAttribute(UserRoles requiredRoles)
    {
        RequiredRoles = requiredRoles;
    }        
}

过滤器/属性绑定(bind)
kernel.BindFilter<AuthorizationFilter>(FilterScope.Controller, 0)
      .WhenControllerHas<RequireRolesAttribute>();
kernel.BindFilter<AuthorizationFilter>(FilterScope.Action, 0)
      .WhenActionMethodHas<RequireRolesAttribute>();

这应该确保任何用 [RolesRequired] 修饰的 Controller / Action 都绑定(bind)到过滤器。到现在为止还挺好。现在我想通过属性声明角色(很像股票 AuthorizeAttribute)并将这些值传递给实际执行授权的过滤器。

预期/假代码:
[RequireRoles(UserRoles.Author)]
public ActionResult Index()
{
    // blah
}

具体来说,

通知 AuthorizationFilter 角色需要什么?过滤器/注入(inject)器可以访问传递给属性构造函数的参数吗?过滤器/注入(inject)器可以从属性公共(public)属性中提取它们吗?

作为引用,这些文章有很大帮助,但不要回答这一件事:

Dependency Injection with Ninject and Filter attribute for asp.net mvc

Custom Authorization MVC 3 and Ninject IoC

B Z、Remo Gloor、其他人……我怎样才能做到这一点?

最佳答案

并带上BindFilter扩展方法进入范围不要忘记添加;

using Ninject.Web.Mvc.FilterBindingSyntax;

关于asp.net-mvc-3 - Ninject 绑定(bind)属性以使用构造函数参数进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8305476/

相关文章:

.net - 与 SerializableAttribute 相比,使用 DataContractAttribute 有什么优势?

asp.net-mvc-3 - 在 ASP.NET MVC3 的 Web 网格中使用 List<string> 作为模型

asp.net-mvc - MVC HTML.RenderAction – 错误 : Duration must be a positive number

c# - 如何创建 2 个相关的下拉列表

ASP.NET MVC 4 C# - 获取要解析的分段元素或完整 URL

mysql - 应用产品属性

java - 业务层 Jersey 的基本依赖注入(inject)

c# - 依赖于实现相同接口(interface)的两个对象的简单注入(inject)器

c# - 如何在 Autofac 中为 InstancePerRequest 服务编写单元测试(或回归测试)

c# - 通过自定义属性生成附加代码