尝试使用Simple Injector的MVVM时,我遵循了以下指南:https://simpleinjector.readthedocs.io/en/latest/wpfintegration.html
即使最简单的例子只有MainWindow.xaml+MainWindowViewModel,它也会创建View和ViewModel的双实例(我也尝试过提交容器的验证(。此外,在应用程序关闭后,进程仍在运行。
[STAThread]
static void Main()
{
var container = new Container();
container.Register<MainWindow>();
container.Register<MainWindowViewModel>();
var app = new App();
app.InitializeComponent();
var mainWindow = container.GetInstance<MainWindow>();
app.Run(mainWindow);
}
然而,我确实将App.xaml
中的StartupUri
替换为Startup
方法,该方法是空的,就好像我没有这样做一样,app.InitializeComponent()
方法将不可用。
对用于MVVM的DI容器有什么建议吗?
正如ContainerOptions.EnableAutoVerification的定义所说,
ContainerOptions.EnableAutoVerification获取或设置一个值,该值指示容器是否应自动触发其验证和诊断解析第一个服务时的配置(例如,第一个呼叫到GetInstance(。该行为与调用Verify((相同手动。默认值为true。
参考:https://github.com/simpleinjector/SimpleInjector/issues/747
您所看到的是Simple Injector v5中引入的行为和突破性变化。此更改在这里进行了更详细的描述,并在v5的发行说明中进行了说明。
简而言之,容器现在会在第一次解析时自动验证完整的配置。在您的情况下,验证会创建所有窗口,而这些窗口在验证后不会关闭(因为Simple Injector不知道它们应该关闭(。这导致应用程序最终保持打开状态。
不使用自动验证,您可以使用:
container.Options.EnableAutoVerification = false
而是在单元测试中重新验证容器。