【发布时间】:2016-04-14 13:06:06
【问题描述】:
我一直在使用 Caliburn.Micro 和 MEF,并且正在尝试让 viewmodelfactory 实现工作。我正在尝试为对话框窗口创建一系列 ViewModel(每个 ViewModel 实例化一个或多个视图模型以生成窗口的整体布局)。我无法正确导入 viewmodelfactory;我可以使用[ImportingConstructor] 毫无问题地获得它,但是当我尝试使用[import] 时,我最终会遇到针对viewModelFactory 的空引用异常。
我实现的“ViewModelFactory”是这样的:
http://blog.pglazkov.com/2011/04/mvvm-with-mef-viewmodelfactory.html
我正在尝试按照以下方式导入视图模型:
[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 中出现错误,指出延迟加载的组合容器为空。
我正在尝试找到一个解决方案,让我仍然可以使用工厂方法,因为它允许我使用当前需要作为我的视图模型一部分的构造函数参数。
编辑
我能够通过在我的视图模型中使用“Initialise”函数来实现此功能,在我的视图模型上使用 [ImportingConstructor] 以及仅包含 IViewModelFactory 声明的构造函数。但是,现在这需要我实例化视图模型并在创建这些视图模型时调用“初始化”函数,因此更优雅的方法会很棒。
谢谢。
【问题讨论】:
标签: c# mvvm caliburn.micro factory-pattern