当前位置: 首页 > news >正文

记录一次Prism9隐式注册引发的事件聚合器失效问题

直接上代码
1、我的注册从App的RegisterTypes方法迁移到了模块

 public class AccountModule : IModule{public void OnInitialized(IContainerProvider containerProvider){}public void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterSingleton<LoginAccount>();}}

虽然我是立即执行的引用模块

 protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog){Logger.WriteLocal("开始加载dll");Assembly.LoadFrom(@"Music.Core.dll");Logger.WriteLocal("开始加载模块");moduleCatalog.AddModule<AccountModule>(InitializationMode.WhenAvailable);var m = moduleCatalog.Modules.First(me => me.ModuleName == nameof(AccountModule));Logger.WriteLocal($"🔍 模块 {m.ModuleName} 状态 = {m.State}");}

但是log显示NotStarted
我虽然登录的时候写了

 public class LoginWindowViewModel : BindableBase{private readonly LoginAccount _loginAccount;public LoginWindowViewModel(IEventAggregator eventAggregator, LoginAccount loginAccount){_eventAggregator = eventAggregator;LoginCommand = new DelegateCommand<Window>(ExecuteLogin);}private IEventAggregator _eventAggregator;private void ExecuteLogin(Window window){_logger.WriteLocal("🚀 准备发布 LoginEvent");_eventAggregator.GetEvent<LoginEvent>().Publish(window);}public ICommand LoginCommand { get; set; }}

但是事件聚合器

 public class LoginAccount{private readonly IEventAggregator _eventAggregator;private ITangdaoLogger _logger = TangdaoLogger.Get(typeof(LoginAccount));public LoginAccount(IEventAggregator eventAggregator){_eventAggregator = eventAggregator;var token = _eventAggregator.GetEvent<LoginEvent>().Subscribe(Login);_logger.WriteLocal($"✅ LoginAccount 订阅完成,token={token.GetHashCode()}");}private void Login(Window window){window.DialogResult = true;}}

并没有进入
因为隐式注册的时候LoginAccount的生命周期是短暂的或者没有传递,此时,我改为

  private readonly LoginAccount _loginAccount;public LoginWindowViewModel(IEventAggregator eventAggregator, LoginAccount loginAccount){_eventAggregator = eventAggregator;_loginAccount = loginAccount;LoginCommand = new DelegateCommand<Window>(ExecuteLogin);}

我只是引入了字段,现在成功了
说明1、可能被GC回收了
2、Prism默认的解析机制,与微软的ServiceCollection不同,ServiceCollection是注册了类才能解析,而Prism具有隐式注册机制,比如程序启动的时候

 return Container.Resolve<MainWindow>();

我们明明没有对MainWindow进行注册,但是却可以解析出来,而ServiceCollection不可以,
这个隐式注册的生命周期是瞬态的,导致拿到的不是同一个

http://www.jsqmd.com/news/32693/

相关文章:

  • 20232318 2025-2026-1 《网络与系统攻防技术》实验四实验报告
  • 用友U8C销售订单开单比较慢
  • Winfrom机器人自动寻路
  • test first
  • Win11 install CUDA 12.5
  • 机器学习-逻辑回归算法-向量版代码
  • 星期三
  • 「学习笔记」文件包含
  • 【AI说Rust 03】如何在 macos m1 系统搭建 rust 开发环境
  • 厨房小白学做饭——4.干锅菜花
  • 操盘计划202511090017
  • Effective C++
  • 厨房小白学做饭——3.虎皮青椒
  • 20251105 之所思 - 人生如梦
  • 【Kubernetes】入门-部署Spring应用
  • 第16天(简单题中等题 二分查找)
  • Java项目常用异常处理场景与实战指南
  • newDay18
  • 11月5日
  • 层级结构
  • 2025.11.5总结 - A
  • C# POST Form
  • 每日反思(2025_11_04)
  • C++练习2
  • 买完学习机还需要去线下补课吗? AI 学习机 + 自习室是最优解!
  • 一次性删除所有的GitHub Action记录
  • 第三十四篇
  • 2025-11-05 PQ v.Next日志记录
  • 11月5日日记
  • 20232319 2024-2025-1 《网络与系统攻防技术》实验四实验报告