WPF Prism模块加载 1.Appconfig的配置方式

在使用Prism框架构建模块化WPF应用程序时,可以通过多种方式加载模块。其中一种方法是通过手动配置app.config文件来定义模块。这种方法允许你在不修改代码的情况下添加或移除模块,提高了灵活性和可维护性。

手动配置 app.config 加载 Prism 模块的步骤

1. 添加必要的NuGet包

确保你的项目中包含了以下NuGet包:

Prism.Unity 或其他你选择的依赖注入容器(如 Prism.DryIoc, Prism.Unity, 等)。

Prism.Wpf

2. 配置 app.config

你需要在项目的 app.config 文件中配置模块信息。下面是一个示例配置:

xml 复制代码
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="modules" type="Microsoft.Practices.Composite.Modularity.ModulesConfigurationSection, Microsoft.Practices.Prism"/>
  </configSections>

  <modules>
    <module assemblyFile="Modules/ModuleA.dll" moduleType="ModuleA.ModuleAModule, ModuleA" moduleName="ModuleA"/>
    <module assemblyFile="Modules/ModuleB.dll" moduleType="ModuleB.ModuleBModule, ModuleB" moduleName="ModuleB" />
  </modules>
</configuration>

在这个配置中,每个元素代表一个要加载的模块。assemblyFile属性指定了模块程序集的相对路径,moduleType属性指定了模块类的完整名称(包括命名空间),而moduleName则是该模块的唯一标识符。

3. 创建模块类

为每个模块创建一个实现IModule接口的类。例如,对于上面提到的ModuleA,你可以创建如下类:

csharp 复制代码
using Prism.Modularity;
using Prism.Regions;

namespace ModuleA
{
    public class ModuleAModule : IModule
    {
        private readonly IRegionManager _regionManager;

        public ModuleAModule(IRegionManager regionManager)
        {
            _regionManager = regionManager;
        }

        public void OnInitialized(IContainerProvider containerProvider)
        {
            // 初始化逻辑
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            // 注册服务等
        }
    }
}

4. 修改App.xaml.cs以支持从配置文件加载模块

你需要重写App.xaml.cs中的ConfigureModuleCatalog方法,以便从app.config读取模块信息并加载它们。这里有一个例子:

csharp 复制代码
  public partial class App : PrismApplication
    {
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }

        protected override IModuleCatalog CreateModuleCatalog()
        {
            return new ConfigurationModuleCatalog();
        }
    }

在这个示例中,我们首先获取了app.config中的modules部分,然后遍历所有模块元素,并将这些信息添加到ModuleCatalog中。

5. 运行应用

现在当你运行应用程序时,它会根据app.config中的配置自动加载指定的模块。

这种方式使得模块管理更加灵活,因为你可以不用修改代码就能增删模块。这对于需要频繁更新或扩展的应用程序特别有用。同时,这也是一种良好的实践,因为它遵循了关注点分离的原则,使得模块管理和业务逻辑相互独立。

xml 复制代码
<module assemblyFile="Modules/ModuleA.dll" moduleType="ModuleA.ModuleAModule, ModuleA" moduleName="ModuleA"/>

这行代码是一个 XML 元素,一般用于配置文件里对.NET 模块进行描述,下面来详细解释其中各个属性:

整体结构

此 XML 元素属于 <module> 类型,它代表一个.NET 模块的配置信息。

属性解释

  1. assemblyFile
    • 此属性的值为 "ModuleA.dll",表明该模块所对应的程序集文件是 ModuleA.dll在.NET 里,程序集属于一个自包含的部署单元,包含类型、资源等信息。
  2. moduleType
    • 属性值 "ModuleA.ModuleAModule, ModuleA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" 给出了模块的完整类型名称以及相关程序集的详细信息。
    • ModuleA.ModuleAModule 是模块的具体类型名称。
    • ModuleA 是程序集的名称。
    • Version=1.0.0.0 指明程序集的版本号为 1.0.0.0
    • Culture=neutral 意味着这个程序集不特定于某一种文化或区域设置。
    • PublicKeyToken=null 表示该程序集没有强名称,也就是没有经过数字签名。
  3. moduleName
    • 属性值为 "ModuleAModule",它为该模块提供了一个友好的名称,方便在配置文件里引用与识别。
  4. startupLoaded
    • 属性值是 "True",这表明在应用程序启动的时候,该模块会被加载。

总结

这行 XML 代码的作用是对一个名为 ModuleAModule 的.NET 模块进行配置,该模块对应 ModuleA.dll 程序集,在应用程序启动时会被加载。

相关推荐
whn197713 小时前
oracle的节点2无法启动asm实例 提示PMON terminating the instance due to error 481
数据库·oracle·wpf
完美火龙篇 四月的友13 小时前
WPF 笔迹延迟优化从硬件到软件的全链路分析
wpf
dalong1014 小时前
WPF:3D立方体
3d·wpf
Xin_ye100862 天前
第三章:内存泄漏的常见“案发现场”
c#·wpf
心平气和量大福大2 天前
C#-WPF-UserControl-生命周期(加载 退出)
开发语言·c#·wpf
czhc11400756633 天前
7.23:Claude code:注册->封表
wpf
心平气和量大福大3 天前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
listening7774 天前
HarmonyOS 6.1 全场景协同实战:从“单机”到“超级终端”的分布式重构
wpf
心平气和量大福大4 天前
C#-WPF-布局-Grid
c#·wpf·visual studio
心平气和量大福大5 天前
C#-WPF-Window主窗体
开发语言·c#·wpf