Документация

Koto.Infrastructure.Http

Anti-Corruption Layer для синхронных HTTP-вызовов между сервисами.

Установка

dotnet add package Koto.Infrastructure.Http

Что внутри

ТипНазначение
ServiceHttpClientАбстрактный базовый класс для типизированных HTTP-клиентов; маппит HTTP-ошибки в Result<T>
ICorrelationIdAccessorИнтерфейс для получения текущего correlation ID
CorrelationIdHandlerDelegating handler, прокидывающий X-Correlation-ID
AddServiceHttpClient<TInterface, TImplementation>()Регистрация со стандартной устойчивостью (retry + circuit breaker + timeout)

Использование

1 — Интерфейс уровня приложения (без HTTP)

// Слой приложения
public interface IPaymentService
{
    Task<Result<PaymentId>> ChargeAsync(Money amount, CancellationToken ct);
}

2 — Реализация через HTTP-клиент

// Слой инфраструктуры
public class PaymentServiceHttpClient : ServiceHttpClient, IPaymentService
{
    public PaymentServiceHttpClient(HttpClient http) : base(http) { }

    public async Task<Result<PaymentId>> ChargeAsync(Money amount, CancellationToken ct)
    {
        var response = await Http.PostAsJsonAsync("/charges",
            new { Amount = amount.Amount, Currency = amount.Currency }, ct);
        return await ReadResultAsync<PaymentId>(response, ct);
    }
}

3 — Регистрация

// Реализуйте ICorrelationIdAccessor (обычно оборачивает IHttpContextAccessor):
services.AddScoped<ICorrelationIdAccessor, HttpContextCorrelationIdAccessor>();

services.AddServiceHttpClient<IPaymentService, PaymentServiceHttpClient>(
    name: "payment-service",
    baseUrl: config["Services:Payment:BaseUrl"]!);

Стандартный пайплайн устойчивости применяется автоматически (3 повтора с экспоненциальной задержкой, circuit breaker, таймаут 30 с).

Маппинг ошибок

HTTP-статусError.Code
404general.not-found
409general.conflict
422general.validation
5xxgeneral.unexpected

Переопределите MapErrorResponse, чтобы добавить специфичные для сервиса коды ошибок.