2

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

我想问题是 - 这是这样做的好方法,还是我应该使用推荐的方法?

4

0 回答 0