PRISM,Unity,EventAggregator,ShellViewModel:构造函数被调用两次

时间:2014-06-07 08:38:48

标签: unity-container viewmodel prism

我的问题的原因是: 我想避免使用EventAggregator-Pattern,因为我认为它使代码难以理解和调试。

我没有使用EventAggregator,而是尝试创建一个ShellViewModel并注入两个ViewModel,它们应该出于某种原因连接在一起:

public ShellViewModel(DocumentViewModel documentViewModel, ToolsViewModel toolsViewModel)
    {
      ...
    }

我现在面临的问题是,documentViewModel和toolsViewModel创建了两次:

在我的Bootstrapper中:

protected override DependencyObject CreateShell()
    {
        return Container.Resolve<Shell>(); //this implicitly calls the ctors of my viewmodels
    }

在我的模块中:

public void Initialize()
    {
        //This calls create the ViewModels again
        regionViewRegistry.RegisterViewWithRegion("ToolRegion", typeof(Views.ToolsView));
        regionViewRegistry.RegisterViewWithRegion("MainRegion", typeof(Views.DocumentView));
    }

我怎样才能避免构造函数被调用两次? 如果这是错误的想法,我如何在同一模块中连接视图模型的事件?

修改(已解决):

public ShellViewModel(IDocumentViewModel documentViewModel, IToolsViewModel toolsViewModel)
    {
      ...
    }

protected override void ConfigureContainer()
 {
   base.ConfigureContainer();
   RegisterTypeIfMissing(typeof (IToolsViewModel), typeof (ToolsViewModel), true);
   RegisterTypeIfMissing(typeof(IDocumentViewModel), typeof(DocumentViewModel), true);
 }

做了这个伎俩。创建视图模型的接口并注册接口是必要的。否则Unity将始终创建一个新实例。

1 个答案:

答案 0 :(得分:0)

public ShellViewModel(IDocumentViewModel documentViewModel, IToolsViewModel toolsViewModel)
    {
      ...
    }

protected override void ConfigureContainer()
 {
   base.ConfigureContainer();
   RegisterTypeIfMissing(typeof (IToolsViewModel), typeof (ToolsViewModel), true);
   RegisterTypeIfMissing(typeof(IDocumentViewModel), typeof(DocumentViewModel), true);
 }

做了这个伎俩。有必要创建视图模型的接口并注册接口。否则Unity将始终创建一个新实例。