NullReferenceException в SimpleInjector.Container.Verify при создании экземпляра представления через XAML - PullRequest
1 голос
/ 29 апреля 2020

Я все еще в процессе вхождения в 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? Надеюсь, мне не придется создавать элементы управления в коде?

1 Ответ

2 голосов
/ 29 апреля 2020

Если бы я сделал предположение, я бы сказал, что приложение не проходит через Контейнер для получения экземпляра MyView

Да, SimpleInjector не может разрешить представление, которое вы определяете встроенным в разметке XAML, как это.

Когда метод InitializeComponent() вызывается во время выполнения, встроенный анализатор пытается создать экземпляр представления, которое вы определили в разметке XAML, без каких-либо знаний или ссылок на какой-либо контейнер.

Таким образом, ваш код завершается ошибкой при попытке разрешить экземпляр MainWindow, потому что исключение выдается из вызова к InitializeComponent() в его конструкторе.

Пример в документации, который вы ссылаетесь на не определяет никаких встроенных представлений. Это работает только для представлений, которые имеют конструктор без параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...