2

カスタム フィルター プロバイダーを使用して、WebAPI プロジェクトのアクション フィルターで Windsor を使用してプロパティ インジェクションを実行するコードがあります。

私は WebAPI ベータ版から WebAPI RC にアップグレードしたところです。コンテナー登録には、次の読み取りに使用されるメソッドがあります。

container.Register(
  Component
    .For<IEnumerable<IFilterProvider>>()
    .UsingFactoryMethod(
      () => GlobalConfiguration.Configuration.ServiceResolver.GetFilterProviders()
    )
);

これにより、フィルター プロバイダーの「既定の」コレクションを取得し、それをカスタム フィルター プロバイダーに渡すことができます。カスタム フィルター プロバイダーは、各既定のプロバイダーからフィルターを取得し、不足している依存関係をプロパティ インジェクションによって挿入し、依存関係が解決されたフィルターを返します。 .

ASP.NET WebAPI RC では、ServiceResolver が DependencyResolver になり、GetFilterProviders() メソッドがなくなりました。代わりに何を使用すればよいですか?

EDIT:右、次の登録構文は機能しています-すべての単体テストに合格しており、メモリリークなどはないようです-しかし、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