Prism `IContainerRegistry` 详细调查与讲解
PrismIContainerRegistry详细调查与讲解1. 什么是IContainerRegistryIContainerRegistry是Prism Library提供的依赖注入容器抽象注册接口。它位于Prism.Ioc命名空间。作用在PrismApplication的protected override void RegisterTypes(IContainerRegistry containerRegistry)方法中统一注册所有服务、View、ViewModel 等。它是对底层具体容器如 Unity、DryIoc 等的统一抽象让开发者不需要关心具体容器实现即可完成注册。2. 核心设计理念Prism不直接使用Microsoft.Extensions.DependencyInjection 作为主容器虽然可以混合使用。Prism 要求容器必须支持Named Registration命名注册这是导航RegisterForNavigation的核心依赖。Scoped 生命周期在 WPF/桌面应用中几乎不被官方推荐使用因为没有 HTTP Request 这样的天然 Scope。Prism 主要使用Transient和Singleton。3. 常用注册方法最重要方法含义生命周期推荐场景示例RegisterTService, TImplementation()注册服务Transient每次解析新实例ViewModel、轻量服务containerRegistry.RegisterIFoo, Foo();RegisterT()注册具体类型Transient仅用具体类时containerRegistry.RegisterFooService();RegisterSingletonTService, TImplementation()注册单例Singleton全局唯一全局服务、Manager、FactorycontainerRegistry.RegisterSingletonIAlarmQueue, AlarmQueue();RegisterSingletonT()注册具体类型为单例Singleton-containerRegistry.RegisterSingletonStationManager();RegisterInstanceT(instance)注册已有实例Singleton已创建的对象、外部容器实例containerRegistry.RegisterInstance(_serviceProvider);RegisterForNavigationTView, TViewModel(name)注册导航页面TransientViewMVVM 导航containerRegistry.RegisterForNavigationMainWindow, MainViewModel(MainWindow);RegisterManyT()/RegisterManySingletonT()一个实现注册多个接口Transient / Singleton一个类实现多个接口高级场景工厂委托注册非常实用containerRegistry.RegisterSingletonIStationRepository(sp_msServiceProvider.GetRequiredServiceIStationRepository());4. 与 Microsoft DI 的混合使用项目场景Prism 的IContainerRegistry不会自动把 MS DI 中的所有服务暴露出来必须手动桥接// 正确做法containerRegistry.RegisterInstance(_msServiceProvider);// 注册整个 ProvidercontainerRegistry.RegisterSingletonIStationRepository(sp_msServiceProvider.GetRequiredServiceIStationRepository());// 桥接关键服务这是您之前报错Unable to resolve service for type IDbContextFactory的根本原因 —— 没有正确桥接或 Factory 未注册。5. 生命周期对比重点Transient最常用在 View/ViewModel。每次Resolve都新创建。Singleton全局共享实例。适合StationManager、ServiceFactory、AlarmQueue等。ScopedPrism 在 WPF 中支持有限主要在 Forms/MAUI 中按 Page 作用域。桌面端通常不推荐使用 Scoped除非你手动创建IServiceScope。6. 最佳实践针对 MaxWell 项目protectedoverridevoidRegisterTypes(IContainerRegistrycontainerRegistry){// 1. MS DI 配置EF CorevarservicesnewServiceCollection();services.AddDbContextFactoryAppDbContext(optionsoptions.UseSqlite(Data Sourcemaxwell.db));services.AddScopedIStationRepository,StationRepository();_msServiceProviderservices.BuildServiceProvider();containerRegistry.RegisterInstance(_msServiceProvider);// 2. 桥接到 Prism关键containerRegistry.RegisterSingletonIStationRepository(sp_msServiceProvider.GetRequiredServiceIStationRepository());// 3. Prism 原生注册containerRegistry.RegisterSingletonIAlarmQueue,AlarmQueue();containerRegistry.RegisterSingletonStationManager();containerRegistry.RegisterSingletonIServiceFactory,ServiceFactory();// 导航containerRegistry.RegisterForNavigationMainWindow,MainViewModel(MainWindow);}7. 其他实用功能containerRegistry.IsRegisteredT()检查是否已注册。支持命名注册Named RegistrationRegisterT(name)。延迟解析LazyT、FuncT自动支持。扩展方法很多社区/官方包提供RegisterDelegate、RegisterMany等高级功能。总结建议继续使用MS DI Prism 桥接的混合模式最稳妥。优先使用AddDbContextFactoryIDbContextFactory。所有全局服务Manager、Factory、Queue使用RegisterSingleton。View/ViewModel 使用RegisterForNavigation内部是 Transient。需要我给出完整对比表Register vs RegisterSingleton vs RegisterInstance或其他具体文件优化代码吗