类库中有一个自定义DelegatingHandler,需要向Autofac注册。webapi主机解析它对运行时的依赖,因此主机没有对这个库的引用。
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注入处理程序的任何想法
发布于 2015-06-16 08:22:06
以下是我对延迟绑定的解决方案:
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>();
}发布于 2015-06-15 14:07:28
似乎您不能在Web中注入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());https://stackoverflow.com/questions/30845632
复制相似问题