WPF Prism应用如何选择指定IoC容器并切换为Unity
Prism 7 WPF(.NET 6)切换Unity容器并注册MediatR方案
核心实现步骤
1. 替换NuGet依赖
- 移除项目默认引用的
Prism.DryIoc包(Prism模板默认搭载DryIoc容器) - 安装和当前Prism主版本号完全匹配的
Prism.Unity官方包,避免版本兼容问题
2. 修改Bootstrapper实现
拿不到IUnityContainer实例的核心原因是之前继承了通用抽象基类PrismBootstrapper,这个基类只暴露容器抽象接口,不绑定具体容器实现。安装Prism.Unity后有两种实现方式可选:
方式一:继承Unity专属Bootstrapper基类(推荐)
直接将Bootstrapper的基类替换为UnityBootstrapper,该基类的Container属性本身就是IUnityContainer类型,可以直接调用预先写好的MediatR注册扩展:
class Bootstrapper : UnityBootstrapper { protected override DependencyObject CreateShell() { return Container.Resolve<MainWindow>(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { // Container属性直接为IUnityContainer类型,无需额外转换 Container.RegisterMediator(new ContainerControlledLifetimeManager()); } }
App类的启动逻辑不需要做任何修改,保持原有实现即可。
方式二:保留原有PrismBootstrapper基类,直接获取底层容器实例
如果不想修改Bootstrapper基类,可以直接在RegisterTypes方法中调用Prism内置的GetContainer()扩展方法,从IContainerRegistry中取出底层的具体容器实例:
class Bootstrapper : PrismBootstrapper { protected override DependencyObject CreateShell() { return Container.Resolve<MainWindow>(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { // 取出底层Unity容器实例 var unityContainer = containerRegistry.GetContainer() as IUnityContainer; // 调用自定义MediatR注册扩展 unityContainer.RegisterMediator(new ContainerControlledLifetimeManager()); } }
注意:使用这种方式必须保证项目已经安装
Prism.Unity包,确认底层容器是Unity实现,否则类型转换会抛出异常。
补充说明
Prism切换IoC容器不需要手动编写容器适配逻辑,官方已经为DryIoc、Unity等常用容器提供了独立的适配包,切换流程完全一致:安装对应容器的Prism适配包,替换对应容器的Bootstrapper基类即可。
内容的提问来源于stack exchange,提问作者Arash
相关产品推荐
相关产品推荐

