使用Ninject的BindFilter<T>时,同一类型的多个属性失败



作为启用身份的授权系统的一部分,我想使用IAuhtorizationFilter和Attributes来限制对控制器中操作方法的访问。我的工作做得很好,部分原因是以下资源的帮助:

  • 要使用构造函数参数筛选的Ninject绑定属性
  • https://github.com/ninject/ninject.web.mvc/wiki/Filter-configurations
  • 自定义授权MVC 3和Ninject IoC
  • https://github.com/ninject/ninject.web.mvc/wiki/Dependency-injection-for-filters

然而,当我试图用我的多个属性装饰一个操作方法时,我会得到如下异常(很抱歉格式化):

[InvalidOperationException:序列包含多个元素]System.Linq.Enumerable.Single(IEnumerable`1源)+2691369Ninject.Web.Mvc.FilterBindingSyntax.c__DisplayClass15`1.b__14(IContext ctx,ControllerContext ControllerContext,ActionDescriptor ActionDescriptor),位于c:\Projects\Ninject\Maintenance2.2\Ninject.Web.Mvc\mvc3\src\Ninject.Web.Mvc\FilterBindingSyntax\FilterFilterBindingBuilder.cs:379在c:\Projects\Ninject\Maintenance2.2\Ninject.Web.Mvc\mvc3\src\Ninject.Web.Mvc\FilterBindingSyntax.c__DisplayClass12.b_11(IContext ctx)中c:\Projects\Ninject\Maintenance2.2\Ninject\src\Ninject\Parameters\Parameter.cs:60中的Ninject.Parameters.c_DisplayClass6.b_4(IContext ctx,ITarget target)c:\Projects\Ninject\Maintenance2.2\Ninject\src\Ninject\Parameters\Parameter.cs:88中的Ninject.Parameters.GetValue(IContext上下文,ITarget-target)c:\Projects\Ninject\Maintenance2.2\Ninject\src\Ninject\Activation\Providers\StandardProvider.GetValue(IContext上下文,ITarget-target)c:\Projects\Ninject\Maintenance2.2\Ninject\src\Ninject\Activation\Providers\StandardProvider.cs:81中的Ninject.Activation.Providers.c_DisplayClass2.b_1(I目标目标)。。。

以下是我的代码的一个非常简化的版本,它演示了MVC3应用程序中的问题:

属性:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class SampleAttribute : Attribute
{
    private Guid typeId;
    public bool IsAllowed { get; set; }
    public SampleAttribute(bool IsAllowed)
    {
        this.IsAllowed = IsAllowed;
        this.typeId = new Guid();
    }
    public override object TypeId
    {
        get
        {
            return (object)typeId;
        }
    }
}

过滤器:

public class SampleFilter : IAuthorizationFilter, IMvcFilter
    {
        private bool isAllowed;
        public bool AllowMultiple
        {
            get { return true; }
        }
        public int Order
        {
            get { return 0; }
        }
        public SampleFilter(bool isAllowed)
        {
            this.isAllowed = isAllowed;
        }
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (!isAllowed)
                throw new Exception("unauthorized");
        }
    }

控制器:

public class HomeController : Controller
    {
        [Sample(true)]
        [Sample(false)]
        public ActionResult Index()
        {
            ViewBag.Message = "Welcome to ASP.NET MVC!";
            return View();
        }
    }

如果Index()方法上的一个或另一个Sample属性被移除,则上述控制器方法按预期工作。将两者都放在适当的位置,生成异常。我意识到,在这个简化的例子中,没有一种情况需要同时使用这两个属性,但这只是为了说明。

我错过了什么?

这是Ninject 2.2的一个已知问题。请改用3.0。

https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/ReleaseNotes.txt

最新更新