由于该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
每个请求中指定的。