Я все еще в процессе вхождения в WPF и также решил дать Simple Injector. Я создал очень простой тестовый проект, основанный на примере интеграции WPF, представленном в документации по Simple Injector . Мой текущий код в значительной степени идентичен этому примеру или, возможно, даже проще, поскольку у меня еще нет никаких служебных объектов.
Отличие состоит в том, что у меня есть простой View с сопровождающей ViewModel, который в настоящее время является единственным вещь, которая находится в MainWindow
:
<Window x:Class="WpfPlayground.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfPlayground"
xmlns:view="clr-namespace:WpfPlayground.View"
mc:Ignorable="d"
Title="MyApp" Height="450" Width="800">
<Grid>
<view:MyView />
</Grid>
</Window>
Мой класс MainWindowViewModel
существует, но в настоящее время все еще пуст. Его конструктор не имеет параметров.
Это то, что у меня пока есть MyView
(XAML все еще просто пустой <Grid />
):
public partial class MyView : UserControl
{
public MyView(MyViewModel myViewModel)
{
InitializeComponent();
DataContext = myViewModel;
}
}
Это Bootstrap()
метод из моего Program
класса:
private static Container Bootstrap()
{
var container = new Container();
container.Register<MainWindow>();
container.Register<MainWindowViewModel>();
container.Register<MyView>();
container.Register<MyViewModel>();
container.Verify();
return container;
}
Теперь я получаю NullReferenceException
внутри конструктора MainWindow
при вызове InitializeComponent()
(«Ссылка на объект не установлена для экземпляра объекта» «). Стек вызовов указывает на вызов container.Verify()
в Program.Bootstrap()
(см. Выше). Конструкторы ни MyViewModel
, ни MyView
никогда не достигаются.
Если бы я предположил, я бы сказал, что приложение не проходит через Container
, чтобы получить экземпляр MyView
. Одна из причин, по которой я провел этот эксперимент, заключалась в том, что мне было интересно посмотреть, как Simple Injector выполнит sh, поскольку документация предполагает, что это каким-то образом произойдет автоматически. Может быть, в документации отсутствует шаг? Что-то, чтобы зарегистрировать какой-то перехватчик? Разве это не правильный способ использовать Simple Injector с WPF / XAML? Надеюсь, мне не придется создавать элементы управления в коде?