C# 将IConfiguration注入ActionFilter
我们可以像这样将IConfiguration注入类:C# 将IConfiguration注入ActionFilter,c#,asp.net-core,asp.net-core-2.1,C#,Asp.net Core,Asp.net Core 2.1,我们可以像这样将IConfiguration注入类: //Controller AppSettings obj = new AppSettings(_configuration); //Class public class AppSettings { private IConfiguration _configuration; public AppSettings(IConfiguration configuration) { _configurati
//Controller
AppSettings obj = new AppSettings(_configuration);
//Class
public class AppSettings
{
private IConfiguration _configuration;
public AppSettings(IConfiguration configuration)
{
_configuration = configuration;
}
...
}
{
"recaptcha": {
"secretKey": "xxx",
"siteKey": "xxx",
"version": "v3"
}
}
现在我正试图将IConfiguration注入到ActionFilter中。最好的方法是什么?在.NET Core 2.x中,
IConfiguration
已注册到DI,因此可以抓取。通常,您只需通过构造函数注入来注入IConfiguration
:
公共类MyActionFilter:ActionFilterAttribute
{
专用只读IConfiguration\u config;
公共MyActionFilter(IConfiguration配置)
{
_config=config;
}
}
这将起作用,但这也意味着当您使用操作过滤器时,您需要提供IConfiguration
作为参数之一:
如果您不必手动提供依赖项,那就更好了
改用
GetService
一种解决方法是在其中一个覆盖上获得所需的服务:
使用Microsoft.AspNetCore.Mvc.Filters;
使用Microsoft.Extensions.Configuration;
使用Microsoft.Extensions.DependencyInjection;
公共类MyActionFilter:ActionFilterAttribute
{
公共重写无效OnActionExecuting(ActionExecutingContext上下文)
{
var config=context.HttpContext.RequestServices.GetService();
字符串recomptchaversion=config.GetValue(“recomptcha:version”);
base.OnActionExecuting(上下文);
}
}
如果您的appsettings.json
有如下内容:
//Controller
AppSettings obj = new AppSettings(_configuration);
//Class
public class AppSettings
{
private IConfiguration _configuration;
public AppSettings(IConfiguration configuration)
{
_configuration = configuration;
}
...
}
{
"recaptcha": {
"secretKey": "xxx",
"siteKey": "xxx",
"version": "v3"
}
}
然后,config.GetValue
应该提供您想要访问的内容
将其以相同的方式注入过滤器。您有什么问题?您描述的问题只是将筛选器用作属性时的问题。并不是所有的过滤器都是属性,所以一般来说,在过滤器中使用构造函数注入是没有问题的。即使您需要将其用作属性,您仍然可以使用
ServiceFilterAttribute
(即[ServiceFilter(typeof(myfilteratribute))]
)这是一个很好的示例。我当时正在研究Recpatca,看到了你的反应。这是正确的金钱与任务,我正在工作的移动Recpatca键的过滤器。