#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. добавьте также страницу и поместите модель представления в качестве аргумента конструктора, чтобы также была введена модель представления.