【问题标题】:Doubled instances of all views/viewmodels with Simple Injector使用 Simple Injector 将所有视图/视图模型的实例加倍
【发布时间】:2020-07-26 09:01:40
【问题描述】:

使用 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() 方法不可用。

关于 DI Container 用于 MVVM 的任何建议?

【问题讨论】:

  • 您是否尝试将EnableAutoVerification 设置为false?即container.Options.EnableAutoVerification = false?
  • @Steven Wow 它确实有帮助,就像一个魅力。你可以做一个答案,这样我就可以标记它,哦,男孩……一行太麻烦了。

标签: c# wpf mvvm simple-injector


【解决方案1】:

正如ContainerOptions.EnableAutoVerification 本身的定义所说

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

参考https://github.com/simpleinjector/SimpleInjector/issues/747

【讨论】:

    【解决方案2】:

    您正在目睹的是 Simple Injector v5 中引入的行为和重大变化。此更改在here 中有更详细的描述,并在release notes of v5 中注明。

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

    您可以不使用自动验证,而是使用:

    container.Options.EnableAutoVerification = false
    

    然后转而从单元测试中验证容器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      相关资源
      最近更新 更多