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 程序集,在应用程序启动时会被加载。

相关推荐
郝学胜-神的一滴1 天前
AI 编程智能体 27:吃透MCP通信机制
人工智能·python·langchain·wpf·numpy·scikit-learn
波力海苔夹心脆6752 天前
C# WPF 资源字典详解:ResourceDictionary、MergedDictionaries 与自定义控件案例
开发语言·c#·wpf·入门教程·resource·资源字典
陈仓主教2 天前
# WPF CheckBox 控件详解与使用—WPF 中的控件(6)--复选框控件(CheckBox)
wpf
光泽雨4 天前
WPF 音视频四大核心方案对比
wpf·音视频
浪扼飞舟5 天前
WPF(数据绑定)
wpf
samble6 天前
从零搭建半导体设备上位机(四):单实例、启动流程与配置文件,App 里那 526 行到底在干什么
wpf·配置文件·单实例
浪扼飞舟6 天前
WPF(控件的继承树、内容控件、布局控件)
wpf
avi91119 天前
电影开源Jevdo - 源码介绍(vue版)没有android 和 没有wpf
android·wpf·框架·数据爬虫·meego·电影管理
吾与谁归in10 天前
C#脚本工具,支持智能提示自动补全(WPF + Roslyn + AvalonEdit)
开发语言·c#·wpf
昂好的day10 天前
WPF 从零入门(上):WPF 是什么、XAML 语法、布局与样式全解
开发语言·c#·wpf