在 NET 6.0 中使用 HttpClient 的最佳实践

Rom*_*man 6 c# system-design dotnet-httpclient asp.net-core .net-6.0

我正在为下一个任务寻找最佳实践解决方案。

我使用 ASP.NET Core 6.0。

我创建了一个可与公共 API 配合使用的 SDK。SDK通过Http请求与API进行通信。我使用HttpClient类来发出 http 请求。

我的目标是构建一个 Nuget 包,以便消费者只需安装此 SDK 即可与公共 API 进行通信。

最后我们有两个项目:

  1. 消费项目
  2. SDK项目

问题:我必须在哪里实例化类的实例HttpClient

我的想法:如果我在Sdk项目中这样做,并且只使用:

HttpClient client = new HttpClient();
Run Code Online (Sandbox Code Playgroud)

不是很好。因为通过创建 HttpClient 类的实例是不好的做法new()。请参阅 https://learn.microsoft.com/en-us/dotnet/fundamentals/networking/http/httpclient-guidelines

根据 MS 的此指南,我必须在消费者项目中通过 DI 启动此实例:

services.AddHttpClient(); 
Run Code Online (Sandbox Code Playgroud)

如果我选择此选项,我认为客户将很难注册我的 SDK,客户必须执行两个步骤:

  1. 注册HttpClient到DI容器中
  2. 在容器中注册SDK

是否可以减少步骤并让我的库的使用变得更容易?

Gur*_*ron 2

在没有看到具体细节的情况下,很难说,但您总是可以通过公开某种方法来减少注册库的步骤,AddMySDK该方法将处理所有需要的注册(包括AddHttpClient调用),因此最终用户只需调用一次默认值登记:

public static class MysSDKRegistrationExtensions
{
    // possibly add another parameter to provide/setup the SDK settings
    public static IServiceCollection AddMySDK(this IServiceCollection services)
    {
        // or add typed ones instead
        services.AddHttpClient(); 

        // rest of registrations 
        return services;
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,多个AddHttpClient调用不应该成为问题(如果最终用户将它们添加到目标应用程序中),因为TryAdd使用了内部方法(请参阅实现),即如果某些所需的服务已经添加到集合中,则不会再次添加。