【发布时间】:2014-09-03 12:14:16
【问题描述】:
我实际上正在使用 WPF、MEF 和 Prism 开展一个项目。当我启动应用程序时,我需要从容器中导出一个模块以在显示主窗口之前打开一个配置窗口。因此代码是这样的:
protected override void OnStartup(StartupEventArgs e)
{ base.OnStartup(e);
Bootstrapper bootstrapper = new Bootstrapper();
bootstrapper.Run();
var window = bootstrapper.statcontainer.GetExport<Configshell>();
var configview = bootstrapper.statcontainer.GetExport<Module.Module1.View.ConfigView>();
window.Value.Show();
Keyboard.Focus(configview.Value.ok_button); }
其中 bootstrapper.statcontainer 是一个公共 CompositeContainer(在 CreateContainer-Method 中与 MEFBootstrapper 的“Maincontainer”一起分配)。我用它在启动时导出模块。 现在在 GetExport() 我得到以下第一次机会异常:
在先决条件导入 'MyApp.Module.Module2.ViewModels.Module2_Functions..ctor (Parameter="C_Aggregator", ContractName="Microsoft.Practices.Prism.PubSubEvents.IEventAggregator")' 设置之前无法调用 GetExportedValue。
这就是那里的 ctor 的样子:
[Import]
public IEventAggregator Configaggregator;
[ImportingConstructor]
public Module2_Functions(IEventAggregator C_Aggregator)
{
this.Configaggregator = C_Aggregator;
Configaggregator.GetEvent<FromConfigWindow>();
FromConfigWindow.Instance.Subscribe(receiveStatusFromConfigWindow);
Configaggregator.GetEvent<ToConfigWindow>();
}
我正在使用 EventAggregator 发布配置并在另一个模块中具有相同的 ctor。令人困惑的是,在我向该 ViewModel 添加另一个完全独立的导入之前,它一直是这样工作的。以下是 ConfigwindowViewModel 的 ctor 的样子:
[ImportingConstructor]
public ConfigVM(IEventAggregator C_aggregator)
{
this.Configaggregator = C_aggregator;
Configaggregator.GetEvent<ToConfigWindow>();
ToConfigWindow.Instance.Subscribe(actualizeCompStatus);
Configaggregator.GetEvent<FromConfigWindow>();
}
[Import]
public IEventAggregator Configaggregator;
这两个事件看起来像这样,并且都已经工作到 2 天前 ;-)
[Export]
public class FromConfigWindow : PubSubEvent<Int16>
{
private static readonly EventAggregator _eventAggregator;
private static readonly FromConfigWindow _event;
static FromConfigWindow()
{
_eventAggregator = new EventAggregator();
_event = _eventAggregator.GetEvent<FromConfigWindow>();
}
public static FromConfigWindow Instance
{
get { return _event; }
}
}
[Export]
public class ToConfigWindow : PubSubEvent<Int16>
{
private static readonly EventAggregator _eventAggregator;
private static readonly ToConfigWindow _event;
static ToConfigWindow()
{
_eventAggregator = new EventAggregator();
_event = _eventAggregator.GetEvent<ToConfigWindow>();
}
public static ToConfigWindow Instance
{
get { return _event; }
}
}
所以最终问题在我看来就像 EventAggregator 没有被实例化,因此异常被抛出。但是我该如何解决这个问题?还是我在构造函数中聚合器的链接做错了什么?
我已经尝试使用 [Import] 属性修改所有构造函数参数,这也引发了相同的异常,或者从 ViewModel 中的 IEventAggregator Configaggregator 对象中删除了所有 [Import] 属性。
问题类似于this link here,但在我的例子中,发生在 Prism 框架中的 EventAggregator 上。
请告诉我是否应该为您提供更多代码部分。
【问题讨论】:
标签: c# wpf prism mef bootstrapper