【发布时间】:2019-06-06 17:34:06
【问题描述】:
我有许多名为 DataAdapter 的类,它们位于不同的文件夹中,每个类都包含一个唯一配置的 HttpClient 以访问外部 API。我使用反射创建了DataAdapter 类的正确版本。
下面的例子:
internal class DataAdapter : IDataAdapter
{
public HttpClient Client => GetClient();
static HttpClient GetClient()
{
// This implementation is unique to the API
var client = new HttpClient();
client.AcceptHeader(MediaType.Json);
client.AuthorizationHeader("123456");
client.Timeout = TimeSpan.FromSeconds(300);
return client;
}
}
这里的前提是为每个 API 创建一个HttpClient。因此,当第二个用户出现并实例化一个新的DataAdapter 类(在同一文件夹中)时,他们应该重用相同的HttpClient。
如果用户在不同的文件夹中实例化 new DataAdapter 类,则应创建不同版本的 HttpClient(如果尚不存在)。
我不确定的是方法中的new HttpClient - 每次实例化这个确切类的新实例时,该示例是否会返回new HttpClient,还是只会创建一个?
【问题讨论】:
-
该方法是静态的,但
Client不是。所以每次创建DataAdapter时,每个实例都会调用静态方法,创建一个新的HttpClient。您是否有机会使用IServiceCollection并注入DataAdapter?这种情况有一个很好的解决方案。 -
不,这是自定义解决方案。我知道有一些关于重用 HttpClients 的新内容,但除了示例中显示的内容之外,还有更多内容。
-
您可以将依赖注入与自定义解决方案一起使用。并不是说我一定要为此添加它。但在这种情况下,您可以这样做:
serviceCollection.AddHttpClient<DataAdapter>();,然后将HttpClient注入DataAdapter的构造函数中。然后你在你的班级中设置你的标题等。容器将管理HttpClient的创建方式,您无需在课堂上处理它。 -
感谢您提供的信息 - 我昨天简要地看了这个。它为我的项目添加了大约 20 个包,但我觉得这有点矫枉过正。不过,如果没有更简单的解决方案,我会重新考虑。
-
HttpClient 可能会令人困惑,请务必了解这些最佳实践,以便正确实施blogs.msdn.microsoft.com/shacorn/2016/10/21/…