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

2024-05-08

我正在尝试连接我的 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(使用前将#替换为@)

ASP.NET Web API 中处理程序和过滤器的依赖注入 的相关文章