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

Prism `IContainerRegistry` 详细调查与讲解

PrismIContainerRegistry详细调查与讲解

1. 什么是IContainerRegistry

IContainerRegistryPrism Library提供的依赖注入容器抽象注册接口。它位于Prism.Ioc命名空间。

作用:在PrismApplicationprotected override void RegisterTypes(IContainerRegistry containerRegistry)方法中统一注册所有服务、View、ViewModel 等。

它是对底层具体容器(如 Unity、DryIoc 等)的统一抽象,让开发者不需要关心具体容器实现即可完成注册。


2. 核心设计理念

  • Prism不直接使用Microsoft.Extensions.DependencyInjection 作为主容器(虽然可以混合使用)。
  • Prism 要求容器必须支持Named Registration(命名注册),这是导航(RegisterForNavigation)的核心依赖。
  • Scoped 生命周期在 WPF/桌面应用中几乎不被官方推荐使用(因为没有 HTTP Request 这样的天然 Scope)。Prism 主要使用TransientSingleton

3. 常用注册方法(最重要)

方法含义生命周期推荐场景示例
Register<TService, TImplementation>()注册服务Transient(每次解析新实例)ViewModel、轻量服务containerRegistry.Register<IFoo, Foo>();
Register<T>()注册具体类型Transient仅用具体类时containerRegistry.Register<FooService>();
RegisterSingleton<TService, TImplementation>()注册单例Singleton(全局唯一)全局服务、Manager、FactorycontainerRegistry.RegisterSingleton<IAlarmQueue, AlarmQueue>();
RegisterSingleton<T>()注册具体类型为单例Singleton-containerRegistry.RegisterSingleton<StationManager>();
RegisterInstance<T>(instance)注册已有实例Singleton已创建的对象、外部容器实例containerRegistry.RegisterInstance(_serviceProvider);
RegisterForNavigation<TView, TViewModel>(name)注册导航页面Transient(View)MVVM 导航containerRegistry.RegisterForNavigation<MainWindow, MainViewModel>("MainWindow");
RegisterMany<T>()/RegisterManySingleton<T>()一个实现注册多个接口Transient / Singleton一个类实现多个接口高级场景

工厂委托注册(非常实用):

containerRegistry.RegisterSingleton<IStationRepository>(sp=>_msServiceProvider.GetRequiredService<IStationRepository>());

4. 与 Microsoft DI 的混合使用(项目场景)

Prism 的IContainerRegistry不会自动把 MS DI 中的所有服务暴露出来,必须手动桥接

// 正确做法containerRegistry.RegisterInstance(_msServiceProvider);// 注册整个 ProvidercontainerRegistry.RegisterSingleton<IStationRepository>(sp=>_msServiceProvider.GetRequiredService<IStationRepository>());// 桥接关键服务

这是您之前报错Unable to resolve service for type 'IDbContextFactory'的根本原因 —— 没有正确桥接或 Factory 未注册。


5. 生命周期对比(重点)

  • Transient:最常用在 View/ViewModel。每次Resolve都新创建。
  • Singleton:全局共享实例。适合StationManagerServiceFactoryAlarmQueue等。
  • Scoped:Prism 在 WPF 中支持有限(主要在 Forms/MAUI 中按 Page 作用域)。桌面端通常不推荐使用 Scoped,除非你手动创建IServiceScope

6. 最佳实践(针对 MaxWell 项目)

protectedoverridevoidRegisterTypes(IContainerRegistrycontainerRegistry){// 1. MS DI 配置(EF Core)varservices=newServiceCollection();services.AddDbContextFactory<AppDbContext>(options=>options.UseSqlite("Data Source=maxwell.db"));services.AddScoped<IStationRepository,StationRepository>();_msServiceProvider=services.BuildServiceProvider();containerRegistry.RegisterInstance(_msServiceProvider);// 2. 桥接到 Prism(关键!)containerRegistry.RegisterSingleton<IStationRepository>(sp=>_msServiceProvider.GetRequiredService<IStationRepository>());// 3. Prism 原生注册containerRegistry.RegisterSingleton<IAlarmQueue,AlarmQueue>();containerRegistry.RegisterSingleton<StationManager>();containerRegistry.RegisterSingleton<IServiceFactory,ServiceFactory>();// 导航containerRegistry.RegisterForNavigation<MainWindow,MainViewModel>("MainWindow");}

7. 其他实用功能

  • containerRegistry.IsRegistered<T>():检查是否已注册。
  • 支持命名注册(Named Registration):Register<T>(name)
  • 延迟解析:Lazy<T>Func<T>自动支持。
  • 扩展方法:很多社区/官方包提供RegisterDelegateRegisterMany等高级功能。

总结建议

  1. 继续使用MS DI + Prism 桥接的混合模式(最稳妥)。
  2. 优先使用AddDbContextFactory+IDbContextFactory
  3. 所有全局服务(Manager、Factory、Queue)使用RegisterSingleton
  4. View/ViewModel 使用RegisterForNavigation(内部是 Transient)。

需要我给出完整对比表(Register vs RegisterSingleton vs RegisterInstance)或其他具体文件优化代码吗?

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

相关文章:

  • DS4Windows终极指南:让PS手柄在PC上完美运行
  • 云计算Linux——数据库MySQL MGR高可用(十九)
  • 沧州CPPM注册采购经理授权中心及电话|官方报考通道 - 中供国培
  • 用倍控G30-J4125工控机搭建All in One家庭服务器:PVE、Docker、软路由全搞定
  • 如何快速实现手机号码地理位置定位:开源工具全面指南
  • Hitboxer:3分钟掌握专业级游戏按键冲突终极解决方案
  • 2026 年两联供系统按需定制指南,稳定型与集成技术优势解析 - mypinpai
  • 终极游戏体验指南:如何用Borderless Gaming告别Alt+Tab切换烦恼
  • rocky linux 8.10 下的 podman 配置镜像加速
  • 我的世界整合包服务器搭建实战:从Fear Nightfall到公网联机【Forge+SakuraFrp】
  • 戴尔G15笔记本终极散热解决方案:TCC-G15开源温度控制中心完全指南
  • 把百度文心输出格式转换成word效果最好的工具有哪些?收费还是免费使用?
  • 深入解析PCI中断路由:从硬件引脚到操作系统中断处理的完整链路
  • 浏览器指纹JS逆向全解析:Canvas、WebGL与Audio指纹绕过
  • 德冠木业好用吗?产品口碑与品牌推荐 - mypinpai
  • SQL注入介绍
  • logit 函数 与 原始分数 logits
  • SQL注入技术详解:从联合查询到盲注实战
  • 高效构建离线学习库:MoocDownloader一站式MOOC下载方案终极指南
  • 魔兽争霸III终极兼容性解决方案:WarcraftHelper完全配置指南
  • Windows远程桌面终极突破:RDP Wrapper创新性解锁多用户并发连接
  • 【无人机三维路径规划】基于遗传算法GA实现复杂山地环境下无人机三维路径规划研究(Matlab代码实现)
  • Windows防休眠终极指南:如何让电脑时刻保持清醒工作状态
  • 3种高效方法部署Windows包管理器:PowerShell一键安装Winget指南
  • 终极解决方案:NoSleep防休眠工具让你的Windows永不休眠
  • 靠谱的涡流模块个性化开发方案推荐 - mypinpai
  • XNBCLI终极指南:掌握星露谷物语XNB文件解包打包技术
  • 构建开源情报平台:模块化设计与自动化聚合实战
  • 网易云音乐NCM格式转换:三步解密法让音乐自由播放
  • NotebookLM赋能图书馆学研究:3大颠覆性应用+5个未公开工作流