← Документация
Koto.Infrastructure.Http
Anti-Corruption Layer для синхронных HTTP-вызовов между сервисами.
Установка
dotnet add package Koto.Infrastructure.Http
Что внутри
| Тип | Назначение |
|---|---|
ServiceHttpClient | Абстрактный базовый класс для типизированных HTTP-клиентов; маппит HTTP-ошибки в Result<T> |
ICorrelationIdAccessor | Интерфейс для получения текущего correlation ID |
CorrelationIdHandler | Delegating 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 |
|---|---|
| 404 | general.not-found |
| 409 | general.conflict |
| 422 | general.validation |
| 5xx | general.unexpected |
Переопределите MapErrorResponse, чтобы добавить специфичные для сервиса коды ошибок.