在Web中使用Lightinject时,如何获得当前的HttpRequestMessage?
例如,在简单注入器中,容器上有以下扩展方法:
var msg = container.GetCurrentHttpRequestMessage() 但我在照明弹里找不到匹配的。
发布于 2015-04-28 11:27:03
如果您查看一下简单的Injector Web集成源代码,您会发现这个实现实际上是非常简单的。您可以自己轻松地实现这一点。
您需要的是创建一个自定义DelegatingHandler,它以以后可以检索的方式存储当前的HttpRequestMessage,如下所示:
public sealed class HttpRequestMessageDelegatingHandler : DelegatingHandler {
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken) {
CurrentMessage = request;
return base.SendAsync(request, cancellationToken);
}
public static HttpRequestMessage CurrentMessage {
get { return (HttpRequestMessage)CallContext.LogicalGetData("RequestMessage"); }
private set { CallContext.LogicalSetData(value, "RequestMessage"); }
}
}
// Register this handler as follows in Web API
configuration.MessageHandlers.Add(new HttpRequestMessageDelegatingHandler());现在您可以检索请求的当前消息,如下所示:
HttpRequestMessageDelegatingHandler.CurrentMessageSimple Injector 文档建议将此调用隐藏在自定义抽象(如简单IRequestMessageProvider )后面。当然,很容易创建一个实现:
private sealed class RequestMessageProvider : IRequestMessageProvider {
public HttpRequestMessage CurrentMessage {
get { return HttpRequestMessageDelegatingHandler.CurrentMessage; }
}
}与创建IRequestMessageProvider抽象和实现不同,您可以将其直接注册为委托,如下所示:
container.Register<Func<HttpRequestMessage>>(_ =>
() => HttpRequestMessageDelegatingHandler.CurrentMessage);我的首选是使用接口而不是Func<T>,因为这样的接口更加显式和可读性更强。
https://stackoverflow.com/questions/29917671
复制相似问题