簡體   English   中英

ASP.NET Core 2.1如何調用引用一個類的過濾器

[英]ASP.NET Core 2.1 How to call filter that refers to a class

我有一個要從函數中調用的動作過濾器。 但是,在此過濾器中,我指的是另一個名為ValidateRoleClient的類。 如何進行服務注入? 還是在我的函數中正確調用此類?

public class RolesFilterAttribute : ActionFilterAttribute
{
    public ValidateRoleClient validateRoleClient;
    public string Role { get; set; }

    public RolesFilterAttribute(ValidateRoleClient validateRoleClient)
    {
        this.validateRoleClient = validateRoleClient;
    }

    public override void OnActionExecuting(ActionExecutingContext 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,
                Token = tvm
            };
            validateRoleClient.ValidateRole(vrvm);
        }
    }
}

這就是我在函數中引用過濾器的方式

[RolesFilter]
public IActionResult About()
{
    return View();
}

我從中得到的當前錯誤是

嚴重性代碼說明項目文件行抑制狀態錯誤CS7036沒有給出與“ RolesFilterAttribute.RolesFilterAttribute(ValidateRoleClient)”的所需形式參數“ validateRoleClient”相對應的參數。

您可以將屬性包裝在FilterFactory如下所示:

public class RolesFilterAttribute : Attribute, IFilterFactory
{
    public string Role { get; set; }       

    public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
    {
        return new RolesFilterAttributeImplementation(
            serviceProvider.GetRequiredService<ValidateRoleClient>(),
            Role
        );
    }

    private class RolesFilterAttributeImplementation : ActionFilterAttribute
    {
        private readonly ValidateRoleClient validateRoleClient;
        private readonly string role;

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

        public override void OnActionExecuting(ActionExecutingContext 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,
                    Token = tvm
                };
                validateRoleClient.ValidateRole(vrvm);
            }
        }
    }

    public bool IsReusable => false;
}

當然,必須首先將ValidateRoleClient服務配置為注入。

然后,您可以像RolesFilterAttribute一樣使用RolesFilterAttribute屬性。

您可以在這里閱讀有關IFilterFactory更多信息: https : IFilterFactory ? IFilterFactory = IFilterFactory

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM