Autofac - DelegatingHandler(HttpMessageHandler)注册

end*_*cts 3 c# ioc-container autofac asp.net-web-api asp.net-web-api2

我有一个DelegatingHandler我需要注册的类库中的自定义Autofac.webapi主机解析它对运行时的依赖性,因此主机没有对此库的引用.

public class LocalizationHandler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync( HttpRequestMessage request, CancellationToken cancellationToken )
    {}
}
Run Code Online (Sandbox Code Playgroud)

在我的Autofac初始化程序类中,我尝试过以下方法:

protected override void Load( ContainerBuilder builder )
{
     builder.RegisterType<LocalizationHandler>();
     builder.Register(c => new LocalizationHandler());
}
Run Code Online (Sandbox Code Playgroud)

在主机中注册此类处理程序的常规方法是:

public static void Register(HttpConfiguration httpConfiguration)
{        
    httpConfiguration.MapHttpAttributeRoutes();          
    httpConfiguration.MessageHandlers.Add(new LocalizationHandler());
}
Run Code Online (Sandbox Code Playgroud)

但是我没有访问这里的主机项目.任何想法如何注入处理程序ContainerBuilder

Cyr*_*and 7

看来你无法注入HttpMessageHandlerWeb API

给定消息处理程序作为实例传递并为整个服务初始化一次.我认为让用户代码首先注入依赖项并使用http配置注册实例更容易.这允许人们编写具有构造函数但不需要依赖注入的自定义消息处理程序.目前的模型更灵活.

>> http://aspnetwebstack.codeplex.com/workitem/62

但是你可以创建能够做你想做的代理.例如 :

public class ProxyDelegatingHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        IEnumerable<DelegatingHandler> innerHandlers = 
            request.GetDependencyScope()
                   .GetServices(typeof(DelegatingHandler))
                   .OfType<DelegatingHandler>();

        HttpMessageHandler handler = this.InnerHandler;
        foreach (DelegatingHandler innerHandler in innerHandlers)
        {
            innerHandler.InnerHandler = handler;
            handler = innerHandler;
        }

        HttpMessageInvoker invoker = new HttpMessageInvoker(handler, false);
        return invoker.SendAsync(request, cancellationToken);
    }
}
Run Code Online (Sandbox Code Playgroud)

并注册您的处理程序,如下所示:

        builder.RegisterType<X1Handler>().As<DelegatingHandler>().InstancePerRequest();
        builder.RegisterType<X2Handler>().As<DelegatingHandler>().InstancePerRequest();

        config.MessageHandlers.Add(new ProxyDelegatingHandler());
Run Code Online (Sandbox Code Playgroud)