Modules 是能够独立开发、测试、部署的功能单元,Modules 可以被设计成实现特定业务逻辑的模块(如 Profile Management),也可以被设计成实现通用基础设施或服务的模块(如 Logging、Exception Management)。
既然 Modules 能够独立开发、测试、部署,那么如何告诉 Shell(我们的宿主程序)去 Load 哪些 Module,以怎样的形式 Load 这些 Module 呢?Prism 为此提供了一个叫 ModuleCatalog 的东西。他用这个来管理 Module。所以在 App 启动之初,需要创建配置一个 ModuleCatalog。
7.1 Prism 中更新了两个方法:
1 2 3 4 5 6 7 void OnInitialized (IContainerProvider containerProvider ) ;void RegisterTypes (IContainerRegistry containerRegistry ) ;
先新增一个 WpfApp 项目,命名 ModuleA,删除 App.config 和 App.xaml,然后将 outputType 改为 Class Library。
在 Views 文件夹下面新建一个用户控件 ViewA
新增一个类 ModuleAModule.cs 实现 IModule 接口(每一个 Module 类都要实现这个接口,而每一个 Module 都要有这样一个类来对 Module 里的资源统一管理)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 using ModuleA.Views;using Prism.Ioc;using Prism.Modularity;using Prism.Regions;namespace ModuleA { public class ModuleAModule : IModule { public void OnInitialized (IContainerProvider containerProvider ) { var regionManager = containerProvider.Resolve<IRegionManager>(); regionManager.RegisterViewWithRegion("ContentRegion" , typeof (ViewA)); } public void RegisterTypes (IContainerRegistry containerRegistry ) { } } }
OnInitialized 实现的时候,顺便将一个 viewA 与 ContentRegion 进行关联,看代码
1 2 var regionManager = containerProvider.Resolve<IRegionManager>();regionManager.RegisterViewWithRegion("ContentRegion" , typeof (ViewA));
App.xaml.cs 中重写 ConfigureModuleCatalog
1 2 3 4 protected override void ConfigureModuleCatalog (IModuleCatalog moduleCatalog ){ moduleCatalog.AddModule<ModuleA.ModuleAModule>(); }
App.xaml.cs 中重写 CreateModuleCatalog
1 2 3 4 protected override IModuleCatalog CreateModuleCatalog (){ return new ConfigurationModuleCatalog(); }
这表示,ModuleCatalog 将从配置文件中创建。
App.config 中添加了节点,并且指定了需要 Load 的 module,并且设置了 startupLoaded 参数来告诉 shell,是否在启动时就加载他。下面是 App.config 的内容,他加载了一个名为 ModuleAModule 的 Module,存在 ModuleA.dll。
1 2 3 4 5 6 7 8 9 10 11 <?xml version="1.0" encoding="utf-8" ?> <configuration > <configSections > <section name ="modules" type ="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf" /> </configSections > <startup > </startup > <modules > <module assemblyFile ="ModuleA.dll" moduleType ="ModuleA.ModuleAModule, ModuleA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName ="ModuleAModule" startupLoaded ="True" /> </modules > </configuration >
Directory ModulePath 就是你需要加载的 module 的 dll 生成目录
1 2 3 4 protected override IModuleCatalog CreateModuleCatalog (){ return new DirectoryModuleCatalog() { ModulePath = @".\Modules" }; }
LoadManual 重写 ConfigureModuleCatalog 方法:
1 2 3 4 5 6 7 8 9 10 protected override void ConfigureModuleCatalog (IModuleCatalog moduleCatalog ){ var moduleAType = typeof (ModuleAModule); moduleCatalog.AddModule(new ModuleInfo() { ModuleName = moduleAType.Name, ModuleType = moduleAType.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand }); }