我有一些代码使用自定义过滤器提供程序在WebAPI项目中的动作过滤器上使用Windsor执行属性注入。
我只是将它从WebAPI beta升级到WebAPI RC,我的容器注册中有一个方法,用于阅读:
container.Register(
Component
.For<IEnumerable<IFilterProvider>>()
.UsingFactoryMethod(
() => GlobalConfiguration.Configuration.ServiceResolver.GetFilterProviders()
)
);
这将允许我获取过滤器提供程序的“默认”集合并将其传递到我的自定义过滤器提供程序,后者将从每个默认提供程序检索过滤器,通过属性注入注入任何缺少的依赖项,并返回过滤器解决了依赖关系。
在ASP.NET WebAPI RC中,ServiceResolver现在是DependencyResolver,不再具有GetFilterProviders()方法 - 我应该在其中使用什么?
编辑:是的,以下注册语法正常工作 - 因为它传递了所有单元测试并且似乎没有泄漏内存或任何东西 - 但我不确定是否明确绑定到Services.FilterProviders()返回的实例是个好主意......
var filterProviders = GlobalConfiguration.Configuration.Services.GetFilterProviders();
container.Register(
Component.For<IEnumerable<IFilterProvider>>().Instance(filterProviders),
Component.For<IFilterProvider>().ImplementedBy<WindsorFilterProvider>()
);
并且,为了完整起见,WindsorFilterProvider看起来像这样:
public class WindsorFilterProvider : IFilterProvider {
private readonly IWindsorContainer container;
private readonly IEnumerable<IFilterProvider> filterProviders;
public WindsorFilterProvider(IWindsorContainer container, IEnumerable<IFilterProvider> filterProviders) {
this.container = container;
this.filterProviders = filterProviders;
}
public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor) {
var filters = filterProviders.SelectMany(fp => fp.GetFilters(configuration, actionDescriptor)).ToList();
foreach (var filter in filters) container.Inject(filter.Instance);
return filters;
}
}
我想问题是 - 这是一个很好的方法吗,或者是否有我应该使用的推荐方法?