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 进行通信。
最后我们有两个项目:
问题:我必须在哪里实例化类的实例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,客户必须执行两个步骤:
HttpClient到DI容器中是否可以减少步骤并让我的库的使用变得更容易?
在没有看到具体细节的情况下,很难说,但您总是可以通过公开某种方法来减少注册库的步骤,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使用了内部方法(请参阅实现),即如果某些所需的服务已经添加到集合中,则不会再次添加。
| 归档时间: |
|
| 查看次数: |
6285 次 |
| 最近记录: |