gpt4 book ai didi

c# - 如何在每个请求上从 IoC 容器解析 Web API 消息处理程序/DelegatingHandler

转载 作者:可可西里 更新时间:2023-11-01 08:26:23 26 4
gpt4 key购买 nike

This MSDN article描述了如何在 ASP.NET Web API 中有效地使用 HTTP 消息处理程序来“装饰”请求。此外,本文还展示了以下代码,用于将您的自定义处理程序注册到 Web API 管道中:

config.MessageHandlers.Add(new MessageHandler1());

我在使用这种方法时遇到的问题是,这会将 MessageHandler1 有效地注册为单例。当处理程序本身没有状态也没有依赖关系时,这很好,但是在基于 SOLID 设计原则的系统中,这些处理程序很可能会有自己的依赖关系,并且很可能其中一些依赖关系需要一个比单例短的生命周期。

如果是这种情况,则不应将此类消息处理程序创建为单例,因为通常情况下,组件的生命周期不应长于其依赖项的生命周期。

所以我的问题是,我们有哪些替代方法来注册自定义消息处理程序,以便它们可以在每次请求时从我们的 IoC 容器中解析?

最佳答案

我不知道消息处理程序有不同的注册 API,但您可以将工厂注入(inject)到消息处理程序中,以使其解析每个方法调用的依赖关系:

public class LifetimeProxyMessageHandler : DelegatingHandler
{
private readonly IHttpMessageHandlerFactory factory;

public LifetimeProxyMessageHandler(IHttpMessageHandlerFactory factory)
{
if (factory == null)
throw new ArgumentNullException("factory");
this.factory = factory;
}

protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpMessageHandler ephemeralHandler = factory.Create();

ephemeralHandler.InnerHandler = this.InnerHandler;

var invoker = new HttpMessageInvoker(ephemeralHandler);

return invoker.SendAsync(request, cancellationToken);
}
}

您可能希望跳过短暂的 HttpMessageHandler,而只是要求工厂创建您希望在此时调用的任何服务的实例。

IHttpMessageHandlerFactory 是我为这个场合编写的自定义接口(interface)。它可能看起来像这样:

public interface IHttpMessageHandlerFactory
{
HttpMessageHandler Create();
}

关于c# - 如何在每个请求上从 IoC 容器解析 Web API 消息处理程序/DelegatingHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20480900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com