You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免Prism模块中EventAggregator事件被多次调用?

问题

订阅在EventAggregator上的事件被多次调用。

public class ModuleViewModel
{
    public ModuleViewModel(IEventAggregator eventAggregator)
    {
        eventAggregator.GetEvent<ModuleEvent>().Subscribe(OnEventReceived);
    }

    private void OnEventReceived(ModuleEvent event)
    {

    }
}
原因

Prism模块的ViewModel构造函数内订阅了事件,而主应用包含多个视图,每个视图都有一个Region,且这些视图均使用同一模块,导致模块被多次初始化。

触发条件
  • 主应用的App类从目录加载模块:
public partial class App : PrismApplication
{
    protected override IModuleCatalog CreateModuleCatalog()
    {
        string modulePath = @".\Modules";
        if (Directory.Exists(modulePath) == false)
        {
            Directory.CreateDirectory(modulePath);
        }

        var catalog = new DirectoryModuleCatalog() { ModulePath = modulePath};
        foreach(var module in catalog.Modules)
        {
            module.InitializationMode = InitializationMode.WhenAvailable;
        }

        return catalog;
    }
    // ...
}
  • 主应用的每个视图都包含Region:
public class Module : IModule
{
    // ...

    public void OnInitialized(IContainerProvider containerProvider)
    {
        var regionManager = containerProvider.Resolve<IRegionManager>();
        regionManager.RegisterViewWithRegion("Region1", typeof(ModuleView));
        regionManager.RegisterViewWithRegion("Region2", typeof(ModuleView));
    }

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<ModuleView, ModuleViewViewModel>();
    }
}
  • 模块无数据:模块显示时,主应用通过事件发送配置;模块运行时,主应用也会通过事件发送配置。
  • 同一时间仅显示主应用的一个视图

编辑:原描述不够清晰,已更新内容。

内容的提问来源于stack exchange,提问作者Bap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 23:40:50