2016-03-04 93 views
0

是否有任何方法来设置在Autofac中注册的web api操作过滤器的执行顺序? 目前,如果我注册以下:Autofac IAutofacActionFilter Web API执行顺序2

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

它是“未知”将要执行的第一和第二。即使我创建了一个新的FilterProvider,它以特定的方式对它们进行排序,但由于removal of any custom IFilterProvidera private ActionDescriptorFilterProvider,它将不起作用。

+0

可能相关:https://github.com/autofac/Autofac.WebApi/issues/7 –

+0

看[来源](https://github.com/autofac/Autofac.WebApi/blob/master/src /Autofac.Integration.WebApi/AutofacWebApiFilterProvider.cs)它看起来应该以反向注册顺序运行(从上到下)。在运行测试时,您是否发现_inconsistent_或只是_unknown给您_的行为? –

+0

通过查看代码片段并阅读autofac文档,我不知道它。它以相反的顺序运行相当一致(你能找出哪条线) - 但是保证这种行为不会改变为自然注册顺序。我可以保证顺序,如果我可以重写私人ActiondescriptorFilterProvider并自己设置顺序 - 注册属性反向与例如。AsWebApiActionFilterFor (order:1);我更喜欢后者,或者实现我自己使用的IFilterProvider。 –

回答

1

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

可以使用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过滤器以反向注册顺序运行。如果有人呼吁ValuesControllerGet行动的过滤器将运行:

  • AuthenticationFilter
  • LoggingFilter的
  • RoundingFilter
  • ErrorFilter

然而,它有时并非如此简单,因为如果您使用类似PreserveExistingDefaults的扩展名,它会在内部更改注册顺序以将最后210注册。

之类的登记顺序复杂性处理违约等等就是为什么我不能指向你线code.You 可以看看CollectionRegistrationSource负责解决IEnumerable<IActionFilter>集合为部分的过滤器提供商。你也可以看看at the filter provider看看事情是如何发生的。

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