Я создаю приложение WPF с использованием ядра .NET 3.1. В прошлом я разрабатывал приложения ASP.Net, и я был рад использовать это в WPF. Я немного поискал и понял, что DI в WPF не так прост, как в ASP.Net, а это означает, что вы должны регистрировать Views и ViewModels.
Моя структура такая
MainWindow
|---BalanceIntegrationPage
|---BalanceIntegrationViewModel
Все обрабатывается в XAML, при этом MainWindow.xaml.cs имеет только сгенерированный код, а BalanceIntegrationPage.xaml.cs имеет одну строку, добавленную к нему в конструкторе.
DataContext = new ScaleIntegrationViewModel();
Это нельзя было обработать в xaml, потому что DI требует параметров в конструкторе.
Вот мой app.xaml.cs:
protected override async void OnStartup(StartupEventArgs startupEventArgs)
{
base.OnStartup(startupEventArgs);
ServiceCollection services = new ServiceCollection();
services.AddScoped<MainWindow>();
services.AddScoped<ScaleInterfacePage>();
services.AddScoped<ScaleIntegrationViewModel>();
services.AddScoped<IScale>(provider => new Scale("1234"));
ServiceProvider serviceProvider = services.BuildServiceProvider();
MainWindow mainWindow = serviceProvider.GetService<MainWindow>();
mainWindow.Show();
}
Моя ScaleIntegrationViewModel выглядит так:
public ScaleIntegrationViewModel(IJMDataIntegration jmContext = null, IBalanceIntegrationContext localContext = null, IScale scale = null)
{
_jmContext = jmContext ?? new JMDataIntegration();
_localContext = localContext ?? new BalanceIntegrationContext();
_scale = scale ?? new Scale("1234");
//JK read from config
_commPort = "1234";
}
Я также попытался использовать шаблон, описанный здесь
Когда я выполняю код, мой объект IScale в конструкторе ViewModel всегда имеет значение null.
Какие-либо предложения??
редактировать:
Основываясь на комментарии, я удалил вызов ViewModel в конструкторе страницы и вместо этого назначил его в .xaml. Это вынудило меня создать конструктор без параметров по умолчанию, который затем прерывает DI.
Почти начинает казаться, что мне нужно внедрить службы в ctor MainWindow, а затем передать их всему, что я вызываю оттуда. Для меня это не имеет смысла, так как в этот момент я могу также выбросить DI и просто обновить их, когда они мне понадобятся.
null
. Что именно вам непонятно? - person dymanoid   schedule 10.03.2020