繁体   English   中英

ASP.NET Web API中处理程序和筛选器的依赖注入

[英]Dependency Injection for Handlers and Filters in ASP.NET Web API

我正在尝试连接我的Web Api项目,以便将Castle Windsor用于IoC

我按照这篇优秀的文章为我的控制器做了这个

我现在正试图将依赖注入到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

到目前为止似乎没有延伸点。 但是有一个请求,请访问http://aspnetwebstack.codeplex.com/workitem/62

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM