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