带参数的MEF和Caliburn.Micro ViewModelFactory

时间:2016-04-14 13:06:07

标签: c# mvvm caliburn.micro factory-pattern

我一直在与Caliburn.Micro和MEF合作,我试图让viewmodelfactory实现正常工作。我尝试的是为对话框窗口创建一个ViewModel链(每个ViewModel实例化一个或多个视图模型以生成窗口的整体布局)。我无法正确导入viewmodelfactory;我可以使用[ImportingConstructor]毫无问题地获取它,但是当我尝试使用[import]时,我最终会对viewModelFactory发出一个空引用异常。

" ViewModelFactory"我实施的是:

http://blog.pglazkov.com/2011/04/mvvm-with-mef-viewmodelfactory.html

我尝试按以下方式导入viewmodel:

[Import]
public IViewModelFactory viewModelFactory { get; set; } 

和IViewModelFactory本身已声明导出(并且与[ImportingConstructor]

一起正常工作
[Export(typeof(IViewModelFactory))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class ViewModelFactory : IViewModelFactory

尝试2

我接下来的努力是尝试将ViewModelFactory实例添加到合成容器中:

protected override void Configure()
{
    var catalog =
    new AggregateCatalog(
            AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>());

    container = new CompositionContainer(catalog);

    var batch = new CompositionBatch();

    batch.AddExportedValue<IWindowManager>(new WindowManager());
    batch.AddExportedValue<IEventAggregator>(new EventAggregator());
    batch.AddExportedValue<IViewModelFactory>(new ViewModelFactory());
    batch.AddExportedValue(container);

    container.Compose(batch);
}

但是,这会导致ViewModelFactory中出现错误,说明加载了Lazy的合成容器为空。

我试图找到一个允许我仍然使用Factory方法的解决方案,因为它允许我使用当前作为我的viewmodel的一部分所需的构造函数参数。

修改

我能够通过&#34;初始化&#34;来实现这一目标。我的viewmodels中的函数,在我的ViewModels上使用[ImportingConstructor],其构造函数只包含IViewModelFactory声明。但是,现在需要我实例化viewmodel并调用&#34; initialise&#34;无论何时我创造它们,所以更优雅的方法会很棒。

感谢。

1 个答案:

答案 0 :(得分:0)

管理实现不同的解决方案,即使用:

IoC.Get<*ViewModelName*>();

仍然没有解决为什么[导入]本身并不起作用,但这确实解决了我的问题。