C# 使用Simple Injector的所有视图/视图模型的两倍实例

C# 使用Simple Injector的所有视图/视图模型的两倍实例,c#,wpf,mvvm,simple-injector,C#,Wpf,Mvvm,Simple Injector,尝试使用简单注入器的MVVM时,我遵循以下指南: 即使最简单的示例只有MainWindow.xaml+MainWindowViewModel,它也会创建View和ViewModel的两个实例(我也尝试过ommit容器验证)。此外,在应用程序关闭后,进程仍在运行 [STAThread] static void Main() { var container = new Container(); container.Register<Mai

尝试使用简单注入器的MVVM时,我遵循以下指南:

即使最简单的示例只有MainWindow.xaml+MainWindowViewModel,它也会创建View和ViewModel的两个实例(我也尝试过ommit容器验证)。此外,在应用程序关闭后,进程仍在运行

    [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);      
    }
[STAThread]
静态void Main()
{
var container=新容器();
container.Register();
container.Register();
var app=新app();
app.InitializeComponent();
var mainWindow=container.GetInstance();
应用程序运行(主窗口);
}
但是,我确实将
App.xaml
中的
StartupUri
替换为
Startup
方法,该方法是空的,好像我没有这样做过
App.InitializeComponent()
方法将不可用

对于用于MVVM的DI容器有什么建议吗?

正如其本身的定义所说

ContainerOptions.EnableAutoVerification获取或设置一个值,该值指示容器是否应 自动触发its的验证和诊断 解决第一个服务时的配置(例如,第一次呼叫 获取实例)。该行为与调用Verify()相同 手动。默认值为true


参考资料

您所看到的是在Simple Injector v5中引入的行为和突破性变化。此更改将在中进行更详细的描述和说明

简而言之,容器现在会在第一次解析时自动验证完整的配置。在您的情况下,验证会创建所有窗口,而验证后窗口不会关闭(因为Simple Injector不知道它们应该关闭)。这将导致应用程序最终保持打开状态

不使用自动验证,您可以将其改为使用:

container.Options.EnableAutoVerification=false

而是在单元测试中验证容器。

您是否尝试将
enableautovification
设置为false?i、 e.
container.Options.enableautovification=false
?@Steven哇,它确实有用,效果很好。你可以给我一个答案,这样我就可以记下来,哦,天哪……一句话太麻烦了。