根据
the documentation
如果您的过滤器具有需要从DI访问的依赖项,那么有几种受支持的方法。可以使用以下方法之一将筛选器应用于类或操作方法:
如果您只是想让它快速工作,您可以使用前两个选项之一将过滤器应用于控制器或控制器操作。执行此操作时,过滤器本身不需要是属性:
[TypeFilter(typeof(ExampleActionFilter))]
public IActionResult Example()
=> View();
这个
ExampleActionFilter
IAsyncActionFilter
您可以使用构造函数注入直接依赖于:
public class ExampleActionFilter : IAsyncActionFilter
{
private readonly IMemoryCache _memoryCache;
public ExampleActionFilter(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{ ⦠}
}
[ServiceFilter]
属性来获得相同的效果,但是您还需要注册
示例ActionFilter
在您的
Startup
.
过滤器厂
如果您需要更多的灵活性,您可以实现自己的过滤器工厂。这允许您自己编写工厂代码来创建实际的过滤器实例。上述的一个可能的实现
示例ActionFilter
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class ExampleActionFilterAttribute : Attribute, IFilterFactory
{
public bool IsReusable => false;
public IFilterMetadata CreateInstance(IServiceProvider serviceProvider)
{
return serviceProvider.GetService<ExampleActionFilter>();
}
}
你就可以用这个了
[ExampleActionFilter]
属性使MVC框架创建
示例ActionFilter
服务筛选器属性
做。只是自己实现它可以避免使用
服务筛选器属性
使用服务定位器
最后,还有另一个快速选项,允许您完全避免构造函数注入。这将使用服务定位器模式在过滤器实际运行时动态解析服务。因此,不是注入依赖项并直接使用它,而是从上下文显式检索它:
public class ExampleActionFilter : ActionFilterAttribute
{
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
var memoryCache = context.HttpContext.RequestServices.GetService<IMemoryCache>();
// â¦
}
}