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。
是否有任何方法可以在 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。