在类库项目的基类中定义 HttpClient 实例的最佳方法是什么?

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 实现。

Mat*_*sen 0

我肯定会使用 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/

是了解此最佳实践的原因和方法的良好资源