将 HttpClient 传递给 class 库

Pass HttpClient to class library

我有一个通过外部系统发送电子邮件的订单管理系统。通过 http 调用访问外部系统。订单管理主要有3个项目:a class library,web api2,和mvc app。在 class 库中,这就是与电子邮件系统交互的服务所在的位置。我已经使用 Autofac 连接了所有依赖项。我正在考虑在 Web api 项目中创建 httpclient,以便将其传递给 class 库。在 ASP.NET 核心中它是可能的,但我不确定如何在 .net 4.8 中做到这一点。

上下文场景如下: 用户将使用调用网络的 mvc 应用程序下订单 api。 Web api 只是为 class 库中的所有逻辑提供端点。当用户下订单时,他们应该会收到一封包含订单详细信息的电子邮件。 class 库调用外部系统发送电子邮件。 class 库有一个名为 IMessagingService 的接口,它有一个方法 SendEmailAsync。此服务 MessagingService 的实现需要一个 httpclient

IMessagingService:

public interface IMessagingService
{
    Task SendEmailAsync(string email, string message);

}

消息服务:

public class MessagingService : IMessagingService
{
    private readonly HttpClient _httpClient;

    public MessagingService(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    public async Task SendEmailAsync(string email, string message)
    {
       await _httpClient.PostAsJsonAsync(/*content*/);
    }
}

网络 API Global.asax.cs:

public class WebApiApplication : System.Web.HttpApplication
{
    internal static HttpClient _httpClient;

    protected void Application_Start()
    {
        //Removed other lines

        Uri baseUri = new Uri("");

        _httpClient = new HttpClient
        {
            BaseAddress = baseUri
        };

        _httpClient.DefaultRequestHeaders.ConnectionClose = false;
        _httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        ServicePointManager.FindServicePoint(baseUri).ConnectionLeaseTimeout = 60 * 1000;
    }
}

Autofac 配置:

builder.RegisterType<MessagingService>()
            .WithParameter("httpClient", WebApiApplication._httpClient)
            .As<IMessagingService>()
            .InstancePerRequest();

是否可以通过 Autofac 将 Global.asax.cs 中创建的 httpclient 传递给 class 库?有什么建议吗?

N.B。现在我无法迁移到 ASP.NET 核心。

如果在 Autofac 中注册期间 _httpClient 为空,那么对我来说,注册似乎是在执行 Application_Start 之前进行的。 Application_Start 创建新引用,但 Autofac 存储旧引用(空)。你应该重新组织你的代码。