コレクションはグローバルであるため、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
リクエストごとに指定されたものを解決します。