找不到适合类型过滤器的构造函数

时间:2018-10-18 11:04:03

标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.1

我有这个最近创建的类型过滤器,它位于一个单独的项目中。

List

这是我在方法上方声明的方式:

public class RolesFilterAttribute : TypeFilterAttribute
{
    public RolesFilterAttribute() : base(typeof(RolesFilterAttributeImpl))
    {

    }

    public class RolesFilterAttributeImpl : IActionFilter
    {
        private readonly ValidateRoleClient validateRoleClient;
        private string Role;
        private string SecretKey;
        public RolesFilterAttributeImpl(string Role, string SecretKey, ValidateRoleClient validateRoleClient)
        {
            this.validateRoleClient = validateRoleClient;
            this.Role = Role;
            this.SecretKey = SecretKey;
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
            if (context.HttpContext.Request.Cookies["Token"] != null || context.HttpContext.Request.Cookies["RefreshToken"] != null)
            {
                TokenViewModel tvm = new TokenViewModel
                {
                    Token = context.HttpContext.Request.Cookies["Token"],
                    RefreshToken = context.HttpContext.Request.Cookies["RefreshToken"]
                };
                ValidateRoleViewModel vrvm = new ValidateRoleViewModel
                {
                    Role = Role,
                    SecretKey = SecretKey,
                    Token = tvm
                };
                validateRoleClient.ValidateRole(vrvm);
            }
        }

        public void OnActionExecuting(ActionExecutingContext context)
        {
            throw new NotImplementedException();
        }
    }
}

我相信我已经在Startup.cs中声明了我需要的内容

[TypeFilter(typeof(RolesFilterAttribute), Arguments = new object[] { "role", "abc1234" })]
public IActionResult About()
{
    return View();
}

但是,当我启动应用程序并导航到“关于”页面时,这就是我遇到的情况:

  

处理请求时发生未处理的异常。   InvalidOperationException:适合类型的构造函数   找不到“ App.Link.Filters.RolesFilterAttribute”。确保   该类型是具体的,并且已针对以下所有参数注册了服务   公共构造函数。   Microsoft.Extensions.DependencyInjection.ActivatorUtilities.FindApplicableConstructor(Type   instanceType,Type []参数类型,out ConstructorInfo   matchingConstructor,输出为Nullable [] parameterMap)

我还没有声明什么呢?

1 个答案:

答案 0 :(得分:2)

[TypeFilter(typeof(RolesFilterAttribute), …]

这表示您要创建的过滤器类型为RolesFilterAttribute。在类型过滤器中,您还将传递两个参数"role""abc1234"。因此,当类型过滤器触发创建RolesFilterAttribute时,它将寻找采用这两个字符串的构造函数。但是只有一个构造函数:

public RolesFilterAttribute()
    : base(typeof(RolesFilterAttributeImpl))
{ }

因此,对于无参数构造函数,您有两个参数。这就是为什么您会收到错误消息。

相反,您要做的是让[TypeFilter]属性创建一个实际的过滤器。因此,您需要在此处传递RolesFilterAttributeImpl类型:

[TypeFilter(typeof(RolesFilterAttributeImpl), Arguments = new object[] { "role", "abc1234" })]

那时候,您的RolesFilterAttribute也变得多余了,因此您可以删除它并定义RolesFilterAttributeImpl(由于它是一个过滤器,因此我将其重命名为RolesFilter ,而不是属性或属性实现。

此外,由于您使用的是[TypeFilter],因此不需要需要在依赖项注入容器中注册过滤器类型。您只需要注册您类型的依赖项,因此仅ValidateRoleClient

因此您的过滤器实现如下所示:

public class RolesFilter : IActionFilter
{
    private readonly ValidateRoleClient validateRoleClient;
    private readonly string role;
    private readonly string secretKey;

    public RolesFilter(string role, string secretKey, ValidateRoleClient validateRoleClient)
    {
        this.validateRoleClient = validateRoleClient;
        this.role = role;
        this.secretKey = secretKey;
    }

    public void OnActionExecuted(ActionExecutedContext context)
    {
        // …
    }

    public void OnActionExecuting(ActionExecutingContext context)
    { }
}

[TypeFilter]是顺便说一句。这是允许使用属性指定过滤器的一种方法。您还可以创建自己的属性,该属性实际上只是一个 filter factory ,它负责在运行时创建过滤器实例。这就是[TypeFilter]的默认设置。

另请参阅我的related answer on the topic of using dependencies in MVC filters