Документ веб-сайта Flurl показывает, что у него есть конфигурация, позволяющая передавать обработчики делегирования.
https://flurl.dev/docs/configuration/
Это будет в конце приведенной выше ссылки.
Весь код настраивается в классе Program. Это приложение-функция Azure, работающее на изолированной рабочей модели.
Хотя бесклиентский шаблон в формате статических клиентов работает, шаблон DI — нет.
FlurlHttp.Clients.WithDefaults(builder => builder
.AddMiddleware(new MyDelegatingHandler()));
Конфигурация выше работает.
А вот шаблон ниже — нет.
// DI pattern:
services.AddSingleton(sp => new FlurlClientCache()
.WithDefaults(builder => builder
.AddMiddleware(sp.GetService())
Мне нужен формат DI, потому что в мой CustomDelegationHandler внедрены другие классы, и было бы проще, если бы версия DI работала.
Поскольку У меня нет интерфейса, я использовал формат ниже. Не был уверен насчет интерфейсов для DelegatingHandlers.
Пример используемого DelegationHandler:
public class MyDelegationHandler : DelegatingHandler
{
private static string CorrelationId => "correlation-id";
private readonly ICorrelationIdQuery _correlationIdQuery;
public MyDelegationHandler(ICorrelationIdQuery correlationIdQuery)
{
_correlationIdQuery = correlationIdQuery ;
}
protected async override Task SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
string correlationId = await _correlationIdQuery.Execute();
if (!request.Headers.Contains(CorrelationId))
{
request.Headers.Add(CorrelationId, correlationId);
}
return await base.SendAsync(request, cancellationToken);
}
}
Итак, мой код выглядит так:
ServiceProvider serviceProvider = services.BuildServiceProvider();
FlurlHttp.Clients.WithDefaults(builder => builder
.AddMiddleware(() => new MyDelegationHandler(serviceProvider.GetService())));
Вышеописанное работает, но не уверен, что вызов такого поставщика услуг является хорошей идеей в классе Program. Это раздел hostbuilder.ConfigureServices, и вызывать BuildServiceProvider посередине нехорошо.
Что я могу делать неправильно в приведенной ниже версии кода DI.
services.AddTransient();
services.AddSingleton(sp => new FlurlClientCache()
.WithDefaults(builder => builder
.AddMiddleware(() => sp.GetService())
));
Подробнее здесь: https://stackoverflow.com/questions/786 ... figuration
Как настроить обработчик делегирования в бесклиентской конфигурации Flurl ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение