11

IC にキャッスル ウィンザーを使用するように Web Api プロジェクトを接続しようとしています。

この優れた記事に従って、コントローラーに対してそれを行いました。

DelegatingHandler と ActionFilterAttribute に依存関係を注入しようとしています

通常の ASP.Net MVC でフィルターに使用される手法をコピーしようとしましたが、Web Api には適用されないようです。

誰かがこれを機能させることができましたか?

関連する拡張ポイントが Web Api にあるのかわかりません

私はこれが提案されているのを見ました

config.MessageHandlers.Add(_myContainer.Resolve<IApiUsageLogger>());

しかし、より良い方法があるかどうかはわかりません。これらのハンドラー/フィルターを作成するメカニズムを利用したいと思います

これは、多くのハンドラーにとって Service Location のにおいがするためです。すべてのハンドラーが作成される単一のポイントはありますか?

何か案は?

4

2 に答える 2

15

コレクションはグローバルであるため、MessageHandlers実質的にはシングルトンのリストです。これは、ハンドラー自体に状態も依存関係もない場合は問題ありませんが、SOLID 設計原則に基づくシステムでは、これらのハンドラーが独自の依存関係を持つ可能性が非常に高く、それらの依存関係の一部が必要になる可能性が非常に高くなります。シングルトンより短い寿命。

その場合、そのようなメッセージ ハンドラーをシングルトンとして作成しないでください。一般に、コンポーネントの有効期間がその依存関係の有効期間より長くなることはありません。

ただし、Web API には、要求ごとにそのようなハンドラーを解決できるフックがありませんが、そのようなメカニズムはプロキシ クラスを使用して簡単に作成できます。

public class DelegatingHandlerProxy<TDelegatingHandler> : DelegatingHandler
    where TDelegatingHandler : DelegatingHandler
{
    private readonly WindsorContainer container;

    public DelegatingHandlerProxy(WindsorContainer container)
    {
        this.container = container;
    }

    protected override async Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        // trigger the creation of the scope.
        request.GetDependencyScope();

        var handler = this.container.Resolve<TDelegatingHandler>();

        handler.InnerHandler = this.InnerHandler;

        var invoker = new HttpMessageInvoker(handler);

        var response = await invoker.SendAsync(request, cancellationToken);

        container.Release(handler);

        return response;
    }
}

このプロキシは次のように使用できます。

GlobalConfiguration.Configuration.MessageHandlers.Add(
    new DelegatingHandlerProxy<MyCustomHandler>(myContainer));

プロキシはシングルトンですが、MyCustomHandlerリクエストごとに指定されたものを解決します。

于 2014-10-20T19:00:28.877 に答える
0

今日の時点で拡張ポイントはないようです。ただし、 http://aspnetwebstack.codeplex.com/workitem/62にリクエストがあります。

于 2012-11-28T09:29:29.647 に答える