我正在尝试使用标准 Microsoft.Extensions.DependencyInjection NuGet 包设置基本 DI。
目前我正在像这样注册我的依赖项:
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>();
}
我使用的 viewModel 需要这样的依赖项:
public ChatListViewModel(
ICommHubClient client,
IRestClient restClient
)
在页面 (.xaml.cs) 的代码隐藏文件中,我需要提供 viewModel,但我还需要在那里提供依赖项。
public ChatListPage()
{
InitializeComponent();
BindingContext = _viewModel = new ChatListViewModel(); //CURRENTLY THROWS ERROR BECAUSE NO DEPENDENCIES ARE PASSED!
}
有谁知道如何在 Xamarin Forms 中使用 Microsoft.Extensions.DependencyInjection 应用依赖注入(inject)(注册和解析)?
最佳答案
您还应该在 DI 容器中注册您的 ViewModel,而不仅仅是您的服务:
在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
解析您的 ViewModel
public ChatListPage()
{
InitializeComponent();
BindingContext = _viewModel = ((App)Application.Current).ServiceProvider.GetService(typeof(ChatListViewModel)) as ChatListViewModel;
}
关于c# - Xamarin 使用 Microsoft.Extensions.DependencyInjection 形成依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66696261/