Мы строим. 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
.