[英]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.