什么替换了ASP.NET WebAPI RC中的ServiceResolver.GetFilterProviders()?

时间:2012-06-14 10:57:53

标签: castle-windsor asp.net-web-api

我有一些代码使用自定义过滤器提供程序在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;
  }
}

我想问题是 - 这是一个很好的方法吗,或者是否有我应该使用的推荐方法?

0 个答案:

没有答案