Я использую Prism.DryIoc
, Prism.DryIoc.Extensions
и Microsoft.Extensions.Http
.
Мне нужно зарегистрировать несколько сервисов, работающих с разными API.
- Сервис, работающий с BaseAddress1 и используя обработчик GZip
- Служба, работающая с BaseAddress2
Я добавил это переопределение, чтобы избежать NotImplementedException:
protected override IContainerExtension CreateContainerExtension() => PrismContainerExtension.Current;
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterServices(s =>
{
s.AddHttpClient<ICenterService, CenterService>(c =>
{
c.BaseAddress = new Uri(BaseAddresses.Api1);
})
.ConfigurePrimaryHttpMessageHandler(sp => new HttpClientHandler
{
AllowAutoRedirect = false,
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip
});
s.AddHttpClient<IS3MediaService, S3MediaService>(c =>
{
c.BaseAddress = new Uri(BaseAddresses.Api2);
});
});
containerRegistry.Register<ICountryService, CountryService>();
}
У меня есть проблемы даже с первой инъекцией, потому что HttpClient
имеет нулевое значение BaseAddress
. Он будет иметь значение BaseAddress
, если я уберу вызов ConfigurePrimaryHttpMessageHandler
.
Если я добавлю второй в другое представление, я получу следующее исключение в представлении, которому я его вставил.
DryIoc.ContainerException: Container is disposed and should not be used: "Container with Scope disposed{no name}
with Rules with {FuncAndLazyWithoutRegistration, AutoConcreteTypeResolution} and without {ThrowOnRegisteringDisposableTransient}
with Made={FactoryMethod=ConstructorWithResolvableArguments} has been DISPOSED!
You may include Dispose stack-trace into the message via:
container.With(rules => rules.WithCaptureContainerDisposeStackTrace())"
Я создал ConsoleApp с помощью одного AddHttpClient
вызова, и конфигурации как обработчика, так и клиента, и он там работает (введенный httpClient имел BaseAddress и может работать с GZip)
Что я делаю не так?