У меня есть приложение Prism с DryIo c в качестве контейнера. Я бы хотел IHttpClientFactory
предоставить HttpClient
с моим типизированным клиентам , например:
public class ExampleService : IExampleService
{
private readonly HttpClient _httpClient;
public RepoService(HttpClient client)
{
_httpClient = client;
}
public async Task<IEnumerable<string>> GetExamplesAsync()
{
// Code deleted for brevity.
}
}
В App.xaml.cs Я зарегистрировал своего типизированного клиента, чтобы его можно было внедрить в модели представления со следующим:
public partial class App
// ...
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// Code deleted for brevity.
containerRegistry.Register<IExampleService, ExampleService>();
}
И это до того, как мы попытаемся использовать IHttpClientFactory
.
Теперь, чтобы добавить его, мы следует AddHttpClient()
на IServiceCollection
. Вот где я подумал, что DryIo c .Microsoft.DependencyInjection был необходим, поэтому, все еще в App.xaml.cs , я написал следующее:
public partial class App
// ...
protected override IContainerExtension CreateContainerExtension()
{
var services = new ServiceCollection();
services.AddHttpClient<IExampleService, ExampleService>(c =>
{
c.BaseAddress = new Uri("https://api.example.com/");
});
var container = new Container(CreateContainerRules())
.WithDependencyInjectionAdapter(services);
return new DryIocContainerExtension(container);
}
Проблема в том, что в моем ExampleService я получаю клиент со следующими характеристиками:
{
"DefaultRequestHeaders":[
],
"BaseAddress":null,
"Timeout":"00:01:40",
"MaxResponseContentBufferSize":2147483647
}
, в то время как я ожидал BaseAddress для быть https://api.example.com/, поэтому вызов API REST завершается ошибкой.
Какой правильный шаблон следует использовать IServiceProvider
при использовании Prism для Xamarin.Forms с DryIo c? К сожалению, по следующему вопросу нет документации или открытого исходного кода, и я немного растерялся.
Спасибо вам, и хорошего дня.
ОБНОВЛЕНИЕ # 1
Согласно виду Дан С. руководство, DryIo c .Microsoft.DependencyInjection было Деинсталлировано, поэтому проект вернулся в свое состояние перед попыткой использования IServiceCollection
зависимостей (в моем случае IHttpClientFactory
), затем я установил Prism.Forms.Extended и позже Prism.DryIo c .Extensions .
После этого CreateContainerExtension () in App.xaml.cs стало:
protected override IContainerExtension CreateContainerExtension()
{
var containerExtension = PrismContainerExtension.Current;
containerExtension.RegisterServices(s =>
{
s.AddHttpClient<IExampleService, ExampleService>(c =>
{
c.BaseAddress = new Uri("https://api.example.com/");
});
});
return containerExtension;
}
и containerRegistry.Register<IExampleService, ExampleService>();
было удалено из RegisterTypes () .
Теперь ExampleService
наконец вводится HttpClient
, и все работает.
ОБНОВЛЕНИЕ # 2
Используются только пакеты, относящиеся к Prism Prism.DryIo c .Forms и Prism.DryIo c. Расширения . Я полностью удалил переопределение CreateContainerExtension () в App.xaml.cs и реорганизовал RegisterTypes () в
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
// Code deleted for brevity.
containerRegistry.RegisterServices(s =>
{
s.AddHttpClient<IExampleService, ExampleService>(c =>
{
c.BaseAddress = new Uri("https://api.example.com/");
});
});
}
Таким образом Я получаю NotImplementedException
.
Однако, переопределяя CreateContainerExtension () следующим:
protected override IContainerExtension CreateContainerExtension() => PrismContainerExtension.Current;
Все наконец-то вернулось к работе!