我有一些代码使用自定义过滤器提供程序在 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;
}
}
我想问题是 - 这是这样做的好方法,还是我应该使用推荐的方法?