Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SimpleInjector.Container.Verify中的NullReferenceException通过XAML实例化视图时_C#_Wpf_Xaml_Simple Injector - Fatal编程技术网

C# SimpleInjector.Container.Verify中的NullReferenceException通过XAML实例化视图时

C# SimpleInjector.Container.Verify中的NullReferenceException通过XAML实例化视图时,c#,wpf,xaml,simple-injector,C#,Wpf,Xaml,Simple Injector,我仍然在进入WPF的过程中,并决定给简单的注入器一个旋转。我创建了一个非常简单的测试项目。我当前的代码与该示例几乎相同,或者更简单,因为我还没有任何服务对象 不同的是,我有一个简单的视图和一个附带的ViewModel,它是当前主窗口上唯一的东西: <Window x:Class="WpfPlayground.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation

我仍然在进入WPF的过程中,并决定给简单的注入器一个旋转。我创建了一个非常简单的测试项目。我当前的代码与该示例几乎相同,或者更简单,因为我还没有任何服务对象

不同的是,我有一个简单的视图和一个附带的ViewModel,它是当前
主窗口上唯一的东西:

    <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>
这是我的
程序
类中的
Bootstrap()
方法:

        private static Container Bootstrap()
        {
            var container = new Container();

            container.Register<MainWindow>();
            container.Register<MainWindowViewModel>();
            container.Register<MyView>();
            container.Register<MyViewModel>();

            container.Verify();

            return container;
        }
private static Container Bootstrap()
{
var container=新容器();
container.Register();
container.Register();
container.Register();
container.Register();
container.Verify();
返回容器;
}
现在,当调用
InitializeComponent()
时,我在
main窗口
构造函数中得到一个
NullReferenceException
(“对象引用未设置为对象的实例”)。调用堆栈指向对
Program.Bootstrap()
中的
container.Verify()
的调用(见上文)。无论是
MyViewModel
还是
MyView
的构造函数都无法访问

如果我猜测一下,我会说应用程序没有通过
容器
来获取
MyView
的实例。我做这个实验的一个原因实际上是因为我想看看简单的注入器是如何完成这项工作的,因为文档似乎暗示这将以某种方式自动发生。文档中是否缺少一个步骤?要注册某种拦截器吗?这可能不是将简单注射器与WPF/XAML一起使用的正确方法吗?希望我不必在代码中创建控件

如果我猜一下,我会说应用程序没有通过容器来获取MyView的实例

是的,SimpleInjector无法像这样解析您在XAML标记中内联定义的视图

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

因此,您的代码在尝试解析
MainWindow
的实例时失败,因为调用构造函数中的
InitializeComponent()
会引发异常


您参考的文档中的示例没有定义任何内联视图。这仅适用于具有无参数构造函数的视图。

诊断此类错误的最佳(可能也是唯一)方法是获取Simple Injector的源代码,将其添加到解决方案中,然后逐步完成验证调用。是的,谢谢!我刚刚发现这个:-这似乎正是我的问题。我还不确定我对建议的解决方案的看法……这个问题有一个实际的错误消息:“配置无效。为MainWindow类型创建实例失败。”@RobertHarvey:是的,现在你提到了。。。这实际上也是我的情况中的外部例外。
NullReferenceException
只是我在调试器中运行它时遇到的第一个异常。对不起,信息不完整。好的,明白了。那么你将如何解决这个问题呢?正如我所说,我刚开始使用WPF,我的所有同事(我刚从这家公司开始)都是这样做的(他们还没有一个标准化的DI框架,这就是为什么我要评估Simple Injector)。您是否愿意接受GitHub问题()中的建议,以基本上在代码中构造视图,然后将它们绑定到
或者根本不使用嵌套视图(带有简单注入器)?嵌套视图通常应该从父元素继承其
DataContext
。它们不应该被注入视图模型。
        private static Container Bootstrap()
        {
            var container = new Container();

            container.Register<MainWindow>();
            container.Register<MainWindowViewModel>();
            container.Register<MyView>();
            container.Register<MyViewModel>();

            container.Verify();

            return container;
        }