2015-06-15 138 views
3

我有一个自定义DelegatingHandler在类库中,我需要注册Autofac。 webapi主机解决了它对运行时的依赖性,所以主机没有对这个库的引用。Autofac - DelegatingHandler(HttpMessageHandler)注册

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

在我Autofac初始化类我已经试过了诸如:

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

正常方式注册主机内的这种处理器将是:

public static void Register(HttpConfiguration httpConfiguration) 
{   
    httpConfiguration.MapHttpAttributeRoutes();   
    httpConfiguration.MessageHandlers.Add(new LocalizationHandler()); 
} 

但我不无法访问这里的主机项目。任何想法如何通过ContainerBuilder注入处理程序?

+0

请参见[56, “问题‘’包括在他们的头衔?” 标签(http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in - 他们的标题),其中共识是“不,他们不应该”! –

回答

0

这里是我的一个后期绑定解决方案:

的Global.asax

protected void Application_Start() 
{ 
    List<DelegatingHandler> messageHandlers = GlobalConfiguration.Configuration.DependencyResolver.GetMessageHandlers(); 
    messageHandlers.ForEach(GlobalConfiguration.Configuration.MessageHandlers.Add); 
} 

助手

public static class DependencyHelper 
{ 
    public static List<DelegatingHandler> GetMessageHandlers(this IDependencyResolver dependencyResolver) 
    { 
     return dependencyResolver.GetServices(typeof (DelegatingHandler)).Cast<DelegatingHandler>().ToList(); 
    } 
} 

图书馆

protected override void Load(ContainerBuilder builder) 
{ 
    builder.RegisterType<GlobalLocalizationHandler>().As<DelegatingHandler>(); 
} 
5

看来,你不能在网页API

鉴于消息处理的实例传入和整个服务被初始化一次注入HttpMessageHandler。我认为让用户代码先注入依赖关系并用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); 
    } 
} 

并注册您的处理程序是这样的:

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

     config.MessageHandlers.Add(new ProxyDelegatingHandler()); 
+0

嗯,我不喜欢这里的代理的想法,但我已经用你的例子在主机项目中进行了后期绑定。非常感谢你的帮助。 :) – endeffects