当通过XAML实例化视图时,在SimpleInjector.Container.Verify中出现NullReference异常。

问题描述 投票:1回答:1

我还在接触WPF的过程中,也决定给Simple Injector一个机会。我创建了一个非常简单的测试项目,它是基于 在Simple Injector文档中提供的WPF集成示例。. 我现在的代码和那个例子差不多,甚至可以说更简单,因为我还没有任何服务对象。

不同的是,我确实有一个简单的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是如何完成这个任务的,因为文档似乎暗示这将以某种方式自动发生。会不会是文档中少了一个步骤?注册某种拦截器的东西?这也许并不是WPFXAML使用Simple Injector的正确方法?希望我不用在代码中创建控件?

c# wpf xaml simple-injector
1个回答
2
投票

如果要我猜测的话,我会说应用程序没有通过Container来获取MyView的实例。

是的,SimpleInjector是 能够解析您在XAML标记中内联定义的视图,就像这样。

InitializeComponent() 方法在运行时被调用,内置的解析器会尝试创建一个你在XAML标记中定义的视图实例,而不知道或不引用任何容器。

因此,当您的代码试图解析一个视图的实例时,您的代码会失败。MainWindow异常,因为在调用到 InitializeComponent() 的构造函数中。

你所引用的文档中的例子并没有定义任何内联视图,这只适用于有无参数构造函数的视图。这只适用于有无参数构造函数的视图。

© www.soinside.com 2019 - 2024. All rights reserved.