我正在设计一个包含多个ViewModel的WPF应用程序,我正在使用Caliburn Micro和MEF。不幸的是,我对MEF和IoC来说都是新手,并且无法解决问题。
应用程序应该有MainView
,其中有几个选项,例如:创建新记录,编辑旧记录,查看报告等。因此,对于每个单元,我有不同的类适用于CreateRecordViewModel
,EditRecordsViewModel
,ViewReportsViewModel
等ViewModel,以及CreateRecordView
,EditRecordsView
,ViewReportsView
等视图的用户控件。
现在,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吗?
答案 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>());
}
}
将IMefDependencyContainer
和Resolve
替换为其在MEF中的名称。