我还在接触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的正确方法?希望我不用在代码中创建控件?
如果要我猜测的话,我会说应用程序没有通过Container来获取MyView的实例。
是的,SimpleInjector是 不 能够解析您在XAML标记中内联定义的视图,就像这样。
当 InitializeComponent()
方法在运行时被调用,内置的解析器会尝试创建一个你在XAML标记中定义的视图实例,而不知道或不引用任何容器。
因此,当您的代码试图解析一个视图的实例时,您的代码会失败。MainWindow
异常,因为在调用到 InitializeComponent()
的构造函数中。
你所引用的文档中的例子并没有定义任何内联视图,这只适用于有无参数构造函数的视图。这只适用于有无参数构造函数的视图。