bbc*_*iao 5 .net c# httpclient
有一个应用程序有 3 个接口,任何想要使用这个应用程序的人都需要实现这些接口。我创建了一个类库项目,其中包含我从同一个基类继承的所有接口实现,以便能够拥有单个 HttpClient。这是我到目前为止所做的:
public class BaseProxy
{
protected static readonly HttpClient Client;
static BaseProxy()
{
Client = new HttpClient();
}
}
Run Code Online (Sandbox Code Playgroud)
我在所有派生类中都使用了这个 Client 来发出 GetAsync 和 PostAsync 请求,如下所示:
public class XProxyImplementation
{
var response = Client.GetAsync(BaseUrl + "XXXApi/GetClientSettings/").Result;
response.EnsureSuccessStatusCode();
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,Web API 中的所有方法都不是异步的,我选择了单例解决方案,因为我不想为每个请求使用 using 块。我的问题是我应该采用 DI 解决方案还是这段代码足以用于内部使用的应用程序?欢迎所有改进建议。
我已经阅读了很多关于使用 DI 容器的答案,但这只是一个带有代理实现的类库。
我的另一个担忧是,即使我想使用 DI,目前我也无法在我的构造函数类中引入 DI,因为使用我的实现的另一个应用程序正在寻找一个空的构造函数。当我尝试将 HttpClient 参数传递给构造函数时,出现以下错误:
当前类型 System.Net.Http.HttpMessageHandler 是抽象类,无法构造
使用我的 dll 的应用程序不允许我将任何参数传递给使用任何抽象类的构造函数。我猜这个应用程序使用 Unity 进行握手,并以某种方式寻找一个空的构造函数。一旦我尝试进行以下更改,我就会收到错误消息:
public BaseProxy() : this(Service.HttpClient)
{
}
public XProxyImplementation(HttpClient client) : base(client)
{
}
Run Code Online (Sandbox Code Playgroud)
这就是为什么我实际上更喜欢单例实例而不是 DI 实现。
我肯定会使用 Microsoft.Extensions.DependencyInjection 包来使用 DI 解决方案。 https://dzone.com/articles/dependency-injection-in-net-core-console-applicati
而且您还应该非常清楚如何使用 GetAsync 等异步方法。使用 .Result 几乎永远不会给出所需的结果,你最好使方法异步并使用 wait 关键字,如下所示:
var response = await Client.GetAsync(BaseUrl + "XXXApi/GetClientSettings/");
Run Code Online (Sandbox Code Playgroud)
https://montemagno.com/c-sharp-developers-stop-calling-dot-result/
是了解此最佳实践的原因和方法的良好资源
| 归档时间: |
|
| 查看次数: |
1713 次 |
| 最近记录: |