You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Prism中使用DryIoc替代Unity配置模块目录?

把Prism WPF示例的Unity引导程序转换为DryIoc

我直接给你转换好的完整代码,再帮你拆解关键修改点:

using Prism.DryIoc;
using Prism.Ioc;
using System.Windows;

class Bootstrapper : DryIocBootstrapper
{
    protected override DependencyObject CreateShell()
    {
        // 和Unity版本用法完全一致,DryIoc容器的Resolve语法没变化
        return Container.Resolve<MainWindow>();
    }

    protected override void InitializeShell()
    {
        // 这部分逻辑不需要修改,和Unity版本完全通用
        Application.Current.MainWindow.Show();
    }

    protected override void ConfigureModuleCatalog()
    {
        // 模块目录的配置逻辑和Unity版本一模一样,因为ModuleCatalog是Prism的核心通用组件
        var catalog = ModuleCatalog;
        // 把你原来Unity版本里的模块注册代码直接复制过来就行,比如:
        // catalog.AddModule<YourFirstModule>();
        // catalog.AddModule<YourSecondModule>(InitializationMode.OnDemand);
    }

    // 可选:注册自定义服务、视图模型等的标准入口
    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        // 用Prism的抽象容器注册依赖,兼容性更强,比如:
        // containerRegistry.Register<IUserService, UserService>();
        // containerRegistry.RegisterSingleton<IConfigService, ConfigService>();

        // 如果需要DryIoc的高级特性(比如自定义生命周期、工厂),可以直接拿到原生容器操作:
        // var dryIocContainer = Container.GetContainer();
        // dryIocContainer.Register<ISpecialService, SpecialService>(DryIoc.Reuse.Scoped);
    }
}

关键修改说明:

  • 替换基类:把UnityBootstrapper换成DryIocBootstrapper,记得引入Prism.DryIoc命名空间。
  • 容器调用兼容:DryIoc版本的Container属性虽然是DryIocContainerExtension类型,但Resolve方法的语法和Unity完全一致,所以CreateShell里的代码几乎没改动。
  • 模块配置复用ConfigureModuleCatalog里的逻辑完全不用改,ModuleCatalog是Prism的通用组件,和具体容器实现无关,你原来的模块注册代码直接复用即可。
  • 依赖注册标准化:Prism提供了IContainerRegistry抽象层,推荐在RegisterTypes里注册依赖,这样以后如果再换容器(比如Autofac),代码改动会极小。当然如果需要DryIoc的高级特性,也可以通过Container.GetContainer()获取原生容器做定制配置。

前置准备:

确保你的项目安装了对应NuGet包:

  • .NET Framework项目:安装Prism.DryIoc
  • .NET Core/.NET 5+项目:安装Prism.DryIoc.Wpf

内容的提问来源于stack exchange,提问作者Robert Harvey

火山引擎 最新活动