我正在尝试连接我的Web Api项目,以便将Castle Windsor用于IoC
我已按照this excellent article为我的控制器完成了这项工作。
我现在正试图将依赖注入到DelegatingHandler和ActionFilterAttribute中
我试图在常规ASP.Net MVC中复制用于过滤器的技术,但它们似乎不适用于Web Api
有人设法让这个工作吗?
我不确定Web Api中的相关扩展点是什么
我已经看到了这个建议
config.MessageHandlers.Add(_myContainer.Resolve<IApiUsageLogger>());
但不确定是否有更好的方法。 我更愿意使用创建这些处理程序/过滤器的机制
因为许多处理程序的服务位置闻起来。 是否有一个点可以创建所有处理程序?
任何想法?
答案 0 :(得分:14)
由于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
。
答案 1 :(得分:0)
截至今天似乎没有延伸点。但请求http://aspnetwebstack.codeplex.com/workitem/62