Как настроить обработчик делегирования в бесклиентской конфигурации FlurlC#

Место общения программистов C#
Ответить
Anonymous
 Как настроить обработчик делегирования в бесклиентской конфигурации Flurl

Сообщение Anonymous »

Документ веб-сайта 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»