You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 12:27:28