Передать HttpClient в библиотеку классов - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть система управления заказами, которая отправляет электронные письма через внешнюю систему. Доступ к внешней системе осуществляется через http-вызовы. Управление заказами состоит в основном из 3 проектов: библиотека классов, web api2 и приложение mvc. В библиотеке классов находится сервис для взаимодействия с системой электронной почты. Я связал все свои зависимости, используя Autofa c. Я думаю о создании httpclient в проекте web api, чтобы он передавался в библиотеку классов. В ASP. NET ядре это возможно, но я не уверен, как это сделать. net 4.8.

Для контекста сценарий выглядит следующим образом: Пользователь будет размещать заказы с помощью приложения mvc, которое вызывает веб-API. Веб-интерфейс API просто предоставляет конечные точки для всех логи c в библиотеке классов. Когда пользователь размещает заказ, он должен получить электронное письмо с деталями заказа. Библиотека классов вызывает внешнюю систему для отправки электронной почты. Библиотека классов имеет интерфейс IMessagingService, который имеет один метод SendEmailAsyn c. Для реализации этой службы 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;
    }
}

Autofa c конфигурация:

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

Возможно ли передать httpclient, созданный в Global.asax.cs, в библиотеку классов через Autofa c? Любые рекомендации?

NB. Сейчас я не могу перейти на ASP. NET core.

1 Ответ

1 голос
/ 24 февраля 2020

Если при регистрации в Autofa c _httpClient равно нулю, то для меня похоже, что регистрация производится до выполнения Application_Start. Application_Start создает новую ссылку, но Autofa c сохраняет старую ссылку (ноль). Вы должны реорганизовать свой код.

...