Web 的 Autofac IAutofacActionFilter 执行顺序 API 2

Autofac IAutofacActionFilter execution order for Web API 2

是否有任何方法可以在 Autofac 注册的网络 api 操作过滤器上设置执行顺序? 目前,如果我注册以下内容:

builder.Register(x => new MyFirstAttribute(x.Resolve<IMyService>())).AsWebApiActionFilterFor<ApiController>().InstancePerRequest();
builder.Register(x => new MySecondAttribute(x.Resolve<IMyService>())).AsWebApiActionFilterFor<ApiController>().InstancePerRequest();

第一个和第二个执行的是'unknown'。即使我创建一个新的 FilterProvider 以特定方式对它们进行排序,由于 removal of any custom IFilterProvider and a private ActionDescriptorFilterProvider.

,它也不会工作

目前无法手动指定注册过滤器的顺序运行。

过滤器的解析方式与使用 IEnumerable<T> implicit relationship type. This happens in the AutofacWebApiFilterProvider 解析其他依赖项的方式相同。与常规过滤器一样,它比 "run in XYZ order" 更复杂 - 还需要考虑控制器与操作范围。

那么,假设您注册了这些:

builder.RegisterType<LoggingFilter>()
    .AsWebApiActionFilterFor<ValuesController>()
    .InstancePerApiRequest();
builder.RegisterType<AuthenticationFilter>()
    .AsWebApiActionFilterFor<ValuesController>()
    .InstancePerApiRequest();
builder.RegisterType<ErrorFilter>()
    .AsWebApiActionFilterFor<ValuesController>(c => c.Get(default(int)))
    .InstancePerApiRequest();
builder.RegisterType<RoundingFilter>()
    .AsWebApiActionFilterFor<ValuesController>(c => c.Get(default(int)))
    .InstancePerApiRequest();

Web API 过滤器 运行 控制器级别然后是操作级别; Autofac 以反向注册顺序过滤 运行。如果有人在 ValuesController 上调用 Get 操作,过滤器将 运行:

  • 身份验证过滤器
  • 日志过滤器
  • 舍入过滤器
  • 错误过滤器

然而,它有时并不那么简单,因为如果您使用像 PreserveExistingDefaults 这样的扩展程序,它会在内部更改注册顺序,将 PreserveExistingDefaults 注册放在最后。

那种处理默认值等的注册排序复杂性是为什么我不能向您指出 of code.You can 查看 CollectionRegistrationSource which is responsible for resolving the IEnumerable<IActionFilter> collections as part of the filter provider. You can also look at the filter provider 看看事情是如何发生的。

如果您需要手动指定顺序,则必须为 AutofacWebApiFilterProvider 编写自己的扩展程序,或者,如果扩展程序不起作用,请自行编写。如果您让它以流畅的方式运行良好,我们很乐意 take a pull request