MEF 和 Caliburn.Micro 带参数的 ViewModelFactory
MEF and Caliburn.Micro ViewModelFactory with Parameters
我一直在使用 Caliburn.Micro 和 MEF,我正在尝试让 viewmodelfactory 实现正常工作。我正在尝试的是为对话框 window 创建一个 ViewModel 链(每个 ViewModel 实例化一个或多个视图模型以生成 window 的整体布局)。我在正确导入 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" 函数,在我的 ViewModel 上使用 [ImportingConstructor] 和一个仅包含 IViewModelFactory 声明的构造函数来实现它。但是,这现在需要我实例化视图模型并在我创建它们时调用 "initialise" 函数,因此更优雅的方法会很棒。
谢谢。
设法对此实施不同的解决方案,即使用:
IoC.Get<*ViewModelName*>();
仍然没有弄清楚为什么 [Import] 本身不起作用,但这确实解决了我的问题。
我一直在使用 Caliburn.Micro 和 MEF,我正在尝试让 viewmodelfactory 实现正常工作。我正在尝试的是为对话框 window 创建一个 ViewModel 链(每个 ViewModel 实例化一个或多个视图模型以生成 window 的整体布局)。我在正确导入 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" 函数,在我的 ViewModel 上使用 [ImportingConstructor] 和一个仅包含 IViewModelFactory 声明的构造函数来实现它。但是,这现在需要我实例化视图模型并在我创建它们时调用 "initialise" 函数,因此更优雅的方法会很棒。
谢谢。
设法对此实施不同的解决方案,即使用:
IoC.Get<*ViewModelName*>();
仍然没有弄清楚为什么 [Import] 本身不起作用,但这确实解决了我的问题。