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

记录一次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不可以,
这个隐式注册的生命周期是瞬态的,导致拿到的不是同一个