目前没有办法手动指定注册过滤器运行的顺序。
可以使用IEnumerable<T>
implicit relationship type以相同的方式解决其他依赖关系的问题。这发生in the AutofacWebApiFilterProvider。与常规过滤器一样,它比“以XYZ顺序运行”更复杂 - 控制器与动作范围也要考虑在一起。
所以,说你注册这些:
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
行动的过滤器将运行:
- AuthenticationFilter
- LoggingFilter的
- RoundingFilter
- ErrorFilter
然而,它有时并非如此简单,因为如果您使用类似PreserveExistingDefaults
的扩展名,它会在内部更改注册顺序以将最后210注册。
之类的登记顺序复杂性处理违约等等就是为什么我不能指向你线code.You 的可以看看CollectionRegistrationSource负责解决IEnumerable<IActionFilter>
集合为部分的过滤器提供商。你也可以看看at the filter provider看看事情是如何发生的。
如果您需要手动指定订单,则必须将自己的扩展程序写入AutofacWebApiFilterProvider
,或者如果扩展不起作用,请自行打印。如果你以流畅的方式运作良好,我们很乐意take a pull request。
可能相关:https://github.com/autofac/Autofac.WebApi/issues/7 –
看[来源](https://github.com/autofac/Autofac.WebApi/blob/master/src /Autofac.Integration.WebApi/AutofacWebApiFilterProvider.cs)它看起来应该以反向注册顺序运行(从上到下)。在运行测试时,您是否发现_inconsistent_或只是_unknown给您_的行为? –
通过查看代码片段并阅读autofac文档,我不知道它。它以相反的顺序运行相当一致(你能找出哪条线) - 但是保证这种行为不会改变为自然注册顺序。我可以保证顺序,如果我可以重写私人ActiondescriptorFilterProvider并自己设置顺序 - 注册属性反向与例如。AsWebApiActionFilterFor(order:1);我更喜欢后者,或者实现我自己使用的IFilterProvider。 –