Prism和IEventAggregator:加载模块时出现故障

本文关键字:故障 模块 加载 IEventAggregator Prism | 更新日期: 2023-09-27 18:20:25

我实际上正在使用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方法中与MEBootstrapper的"Maincontainer"一起分配)。我在启动时使用它导出模块。现在在GetExport()中,我得到了以下第一次抛出异常的机会:

在设置先决条件导入"MyApp.Module.Module2.ViewModels.Module2_Functions.ctor(Parameter="C_Aggregator",ContractName="Microsoft.Practices.Prism.PubSubEvents.IEventAggregattor")"之前,无法调用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;

这两项活动看起来是这样的,直到两天前都已经开始了;-)

[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]属性修改所有构造函数参数,这也引发了相同的异常,或者从ViewModels中的IEventAggregatorConfigaggregator对象中删除了所有[Import'属性。

这个问题类似于这里的这个链接,但在我的案例中,来自Prism框架的EventAggregator会出现这种情况。

请告诉我是否应该为您提供更多的代码部分。

Prism和IEventAggregator:加载模块时出现故障

我不知道为什么要导出PubSubEvents或在其中保存对静态新EventAggregator的引用。您应该只使用EventAggregator的一个实例(在本例中),它将从您的容器中获得(Prism会为您放置它)。

您应该回到基础知识,阅读优秀的Prism文档。第9节"松散耦合组件之间的通信"概述EventAggregator和PubSubEvents。

如果你想创建一个模拟你遇到的问题的基本项目并将其上传到某个地方,我很乐意为你看一看。

看起来错误是因为在开始对所有导入进行操作之前,您没有满足所有导入。我同意克里斯的意见,你应该回去看看文件。这里有很多事情似乎过于复杂了。为什么里面有new EventAggregator()?MEF应该为您导入该依赖项。为什么要到处乱搞集装箱和出口?看起来你正在做很多工作,这些工作应该由MEF和Prism负责。