将HttpClient传递给类库

问题描述 投票:0回答:1

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

对于上下文,情况如下:用户将使用调用Web API的mvc应用下订单。 Web API仅提供类库中所有逻辑的端点。用户下订单时,应该会收到一封包含订单详细信息的电子邮件。类库调用一个外部系统来发送电子邮件。类库具有一个名为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*/);
    }
}

Web 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传递给类库?有什么建议吗?

N.B。目前,我无法迁移到ASP.NET Core。

c# asp.net-web-api2 autofac .net-4.8
1个回答
0
投票

看来是在Application_Start执行之前进行了注册。 Application_Start创建新的引用,但是Autofac存储旧的(空)。您应该重新组织代码。

© www.soinside.com 2019 - 2024. All rights reserved.