IHostEnvironment и без DI в конструкторе запуска. NET Core 3+ - PullRequest
0 голосов
/ 31 января 2020

Мы строим. NET Основные микросервисы.

Многие из наших микросервисов используют HttpClient протоколирование через ConfigurePrimaryMessageHandler()

С. NET Core 2+ наш подход был до

services.AddHttpClient().ConfigurePrimarymessageHandler() в ConfigureServices из Startup.cs. Здесь нам нужно было передать ILogger<T>, и мы получили бы его, внедрив его в наш конструктор Startup.

Теперь, когда мы перешли на IHostEnvironment, мы больше не можем использовать DI для внедрения ILogger<T> в Конструктор запуска И мы не можем внедрить IServiceCollection в Configure().

Одна из моих идей заключалась в том, чтобы создать HttpClientBuilder, сохранить ссылку на него и затем выполнить ConfigurePrimaryMessageHandler в Configure ... Это не сработало. Я предполагаю, потому что, как только это построено, это построено, так что вам нужно сделать это в ConfigureServices.

Таким образом, я закончил тем, что придумал противный хак, который работает, но он кажется отвратительным:

У меня есть ILogger<T> в качестве защищенного члена моего Startup.cs.

Я передаю его (его ноль) в мои HttpClientBuilder s ...

Затем в Configure() Я ввожу ILogger<T> и устанавливаю переменную защищенного члена.

Тьфу!

Это выглядит примерно так:

class Startup
{
    protected ILogger<HttpClientLoggingHandler> _logHack;

    public void ConfigureServices(IServiceCollection)
    {
        services.AddHttpClient<T>().ConfigurePrimaryMessageHandler(()=>{ new 
        HttpClientLoggingHandler(_logHack, otherstuff) });
    }

    public void Configure(IApplicationBuilder bld, ILogger<T> logForHack, otherstufffordi)
    {
         _logHack = logForHack;   // note this works, but is this really a good design pattern?
    }
}

Так что это работает ... Но это не похоже на действительно отличный шаблон дизайна. Любой совет есть кто-нибудь? Это действительно подход, который мы должны использовать? Ощущение, будто что-то здесь упущено, когда мы мигрировали на IHostEnvironment.

1 Ответ

3 голосов
/ 31 января 2020

Вы можете просто сделать .ConfigurePrimaryMessageHandler<HttpClientLoggingHandler>();, если зарегистрирован HttpClientLoggingHandler.

Лямбда-перегрузки для ConfigurePrimaryMessageHandler также могут передать вам IServiceProvider. Оттуда звоните sp.GetRequiredService<T>.

...