使用Caliburn Micro和MEF的多视图模型

时间:2017-05-03 22:21:09

标签: c# wpf mvvm mef caliburn.micro

我正在设计一个包含多个ViewModel的WPF应用程序,我正在使用Caliburn Micro和MEF。不幸的是,我对MEF和IoC来说都是新手,并且无法解决问题。

应用程序应该有MainView,其中有几个选项,例如:创建新记录,编辑旧记录,查看报告等。因此,对于每个单元,我有不同的类适用于CreateRecordViewModelEditRecordsViewModelViewReportsViewModel等ViewModel,以及CreateRecordViewEditRecordsViewViewReportsView等视图的用户控件。

现在,MainViewModel是指挥,我正在使用这样的代码:

public class ShellViewModel : Conductor<object> 
{         
     public void ShowCreateRecord()
     {
          ActivateItem(new CreateRecordViewModel(...Dependencies...));
     }

     public void ShowEditRecords() 
     {
          ActivateItem(new EditRecordsViewModel(...Dependencies...));
     }

     ...
}

由于MEF容器位于Bootstrapper,因此我对如何在MainViewModel中使用构造函数注入感到有点迷茫。我的第二个问题是关于GC。如何测试创建的ViewModel是否被正确处理?

我知道这些问题似乎有些讽刺,但我真的很感激解决方案。我应该使用[Import]装饰我的Property setter而不是使用Constructor Injection吗?

1 个答案:

答案 0 :(得分:1)

我自己并不熟悉MEF,但大多数DI都有类似的想法。 您必须将容器(MEF容器)注入视图模型,并使用容器解析相应的视图模型。

你不应该自己实例化视图模型,而是在主vm中,通过构造函数或属性注入注入容器解析服务(再次 - 不熟悉MEF),然后调用ActivateItem(_DependencyService.Resolve<CreateRecordViewModel>());

而且顺便说一句,主虚拟机本身也应该由容器实例化,所以你显然不需要手动将容器注入主虚拟机。

IoC只是信任容器为你解决任何问题,否则,它是容器注册错误注册的类型:

public class ShellViewModel : Conductor<object> 
{
  private readonly IMefDependencyContainer _container;      
  public ShellViewModel(IMefDependencyContainer container) {
    _container = container;   
  }     

  public void ShowCreateRecord()
  {
    ActivateItem(_container.Resolve<CreateRecordViewModel>());
  }
}

IMefDependencyContainerResolve替换为其在MEF中的名称。