DryIo c и IServiceProvider на Prism для Xamarin.Forms (DryIo c .Microsoft.DependencyInjection) - PullRequest
1 голос
/ 05 февраля 2020

У меня есть приложение 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;  

Все наконец-то вернулось к работе!

1 Ответ

2 голосов
/ 05 февраля 2020

Если вы хотите использовать расширения IServiceCollection, такие как AddHttpClient, я бы предложил использовать расширения контейнера Prism. В вашем случае это будет Prism.DryIo c .Extensions . Контейнерные расширения предоставляют много дополнительной поддержки, включая поддержку регистрации сервисов с помощью расширений Service Collection.

Вы можете либо установить Prism.Forms.Extended, и все это будет просто работать, либо вы можете обновить свое приложение как следует:

protected override IContainerExtension CreateContainerExtension() =>
    PrismContainerExtension.Current;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...