Xamarin Формирует внедрение зависимостей с помощью Microsoft.Расширения.Зависимость от инъекции

#c# #xamarin #xamarin.forms #dependency-injection #dependencies

Вопрос:

Я пытаюсь настроить базовый DI со стандартным Microsoft.Расширения.Пакет NuGet dependencyinjectionпакет.

В настоящее время я регистрирую свои зависимости следующим образом:

 public App()
{
    InitializeComponent();
    var serviceCollection = new ServiceCollection();
    ConfigureServices(serviceCollection);
}

private static void ConfigureServices(ServiceCollection serviceCollection)
{
    serviceCollection.AddSingleton<IRestClient>(_ => new RestClient("https://localhost:44379/api/"));
    serviceCollection.AddScoped<ICommHubClient, CommHubClient>();
}
 

Я использую модель представления, которая требует таких зависимостей:

  public ChatListViewModel(
        ICommHubClient client,
        IRestClient restClient
        )
 

В файле кода страницы (.xaml.cs) мне нужно указать модель представления, но мне также нужно указать зависимости там.

 public ChatListPage()
{
     InitializeComponent();
     BindingContext = _viewModel = new ChatListViewModel(); //CURRENTLY THROWS ERROR BECAUSE NO DEPENDENCIES ARE PASSED!
}
 

есть ли кто-нибудь, кто знает, как я могу применить внедрение зависимостей (регистрация и разрешение) в Microsoft.Расширения.Зависимость в формах Xamarin?

Ответ №1:

Вы также должны зарегистрировать свои модели просмотра в контейнере DI, а не только свои сервисы:

В App.xaml.cs разделе измените свой код на:

 public ServiceProvider ServiceProvider { get; }

public App()
{
    InitializeComponent();
    
    var serviceCollection = new ServiceCollection();
    ConfigureServices(serviceCollection);
    ServiceProvider = serviceCollection.BuildServiceProvider();
    
    MainPage = new ChatListPage();
}

private void ConfigureServices(ServiceCollection serviceCollection)
{
    serviceCollection.AddSingleton<IRestClient>(_ => new RestClient("https://localhost:44379/api/"));
    serviceCollection.AddScoped<ICommHubClient, CommHubClient>();
    serviceCollection.AddTransient<ChatListViewModel>();
}
 

А затем вы можете разрешить свою модель представления из ServiceProvider

 public ChatListPage()
{
    InitializeComponent();
    BindingContext = _viewModel = ((App)Application.Current).ServiceProvider.GetService(typeof(ChatListViewModel)) as ChatListViewModel;
}
 

Комментарии:

1. добавьте также страницу и поместите модель представления в качестве аргумента конструктора, чтобы также была введена модель представления.