Lightinject with Web API - 如何获取 HttpRequestMessage



使用 Lightinject 和 Web API 时,如何获取当前的 HttpRequestMessage?
例如,在简单注射器中,我在容器上有以下扩展方法:

var msg = container.GetCurrentHttpRequestMessage() 

但是我在Lightinject中找不到匹配的。

如果您查看Simple Injector Web API集成源代码,您会发现实现实际上非常简单。您可以自己轻松实现这一点。

您需要创建一个自定义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.CurrentMessage
简单

注入器文档建议将此调用隐藏在自定义抽象(如简单IRequestMessageProvider)后面。当然,实现很容易创建:

private sealed class RequestMessageProvider : IRequestMessageProvider {
    public HttpRequestMessage CurrentMessage {
        get { return HttpRequestMessageDelegatingHandler.CurrentMessage; }
    }
}

无需创建IRequestMessageProvider抽象加实现,可以直接将其注册为委托,如下所示:

container.Register<Func<HttpRequestMessage>>(_ =>
    () => HttpRequestMessageDelegatingHandler.CurrentMessage);

我更喜欢使用接口而不是Func<T>,因为这样的接口更加明确和可读。

相关内容

  • 没有找到相关文章

最新更新