Autofac - 单例 HttpClient

25

在各种地方都看到过,HttpClient 应该被重复使用,而不是每次都创建一个新实例。

https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

我正在项目中使用 Autofac。

这样做是否是让一个 HttpClient 实例可供注入到服务中的好方法呢?

builder.Register(c => new HttpClient()).As<HttpClient>().SingleInstance();

看起来可以工作 :)


那么你的问题是什么?(看起来你在最后两行已经回答了自己的问题 - Igor
这是否是很好的实践呢?我对 DI 还非常陌生。 - wingyip
4
毫无疑问,这种方法是没有任何问题的。 - Igor
1
太棒了。当它如此轻松地工作时,我想我只是被惊艳到了 :) - wingyip
1个回答

35

如果您希望在整个应用程序生命周期中只有一个,那么这很好,但是您可能需要针对每个API端点进行不同的配置。

builder.Register(ctx => new HttpClient() {BaseAddress = new Uri("https://api.ipify.org")})
    .Named<HttpClient>("ipify")
    .SingleInstance();

builder.Register(ctx => new HttpClient() { BaseAddress = new Uri("https://api.postcodes.io") })
    .Named<HttpClient>("postcodes.io")
    .SingleInstance();

那么我们就有一个PostcodeQueryHandler

public class PostcodeQueryHandler
{
    public PostcodeQueryHandler(HttpClient httpClient) { }
}

我们会像这样设置绑定:

builder.Register(ctx => new PostcodeQueryHandler(ctx.ResolveNamed<HttpClient>("postcodes.io")))
        .InstancePerDependency();

3
我想补充一下,InstancePerDependency()是默认行为,如果你不需要的话可以跳过它。InstancePerDependency方法 - Ivo Gluhchev
@Kevin Smith,感谢提供另一种解决方案!在同一个地方拥有这两个解决方案真是太好了。 - ganjeii

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接