我正在尝试连接我的 Web Api 项目以使用 Castle Windsor 进行 IoC
我已经通过以下方式为我的控制器做到了这一点这篇优秀的文章 http://blog.ploeh.dk/2012/10/03/DependencyInjectionInASPNETWebAPIWithCastleWindsor.aspx.
我现在尝试将依赖项注入到我的 DelegatingHandler 和 ActionFilterAttribute 中
我尝试复制常规 ASP.Net MVC 中用于过滤器的技术,但它们似乎不适用于 Web Api
有人设法让它工作吗?
我不确定 Web Api 中的相关扩展点是什么
我看到有人建议这样做
config.MessageHandlers.Add(_myContainer.Resolve<IApiUsageLogger>());
但不确定是否有更好的方法。
我更愿意利用创建这些处理程序/过滤器的机制
因为这对很多处理程序来说都是服务地点的味道。
是否有一个点可以创建所有处理程序?
有任何想法吗?
自从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
根据每个请求。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)