從PRISM開始學WPF(四)Prism-Module?
從PRISM開始學WPF(一)WPF?
從PRISM開始學WPF(二)Prism?
從PRISM開始學WPF(三)Prism-Region?
從PRISM開始學WPF(四)Prism-Module?
從PRISM開始學WPF(五)MVVM(一)ViewModel?
從PRISM開始學WPF(六)MVVM(二)Command?
從PRISM開始學WPF(七)MVVM(三)事件聚合器EventAggregator?
0x4Modules
Modules是能夠獨立開發、測試、部署的功能單元,Modules可以被設計成實現特定業務邏輯的模塊(如Profile Management),也可以被設計成實現通用基礎設施或服務的模塊(如Logging、Exception Management)。
既然Modules能夠獨立開發、測試、部署,那麽如何告訴Shell(我們的宿主程序)去Load哪些Module,以怎樣的形式Load這些Module呢?Prism為此提供了一個叫ModuleCatalog的東西。他用這個來管理Module。所以在App啟動之初,需要創建配置一個ModuleCatalog。
?:
先新增一個WpfApp項目,命名ModuleA,刪除App.config和App.xaml,然後將outputType改為Class Library。
在Views文件夾下面新建一個用戶控件ViewA
新增一個類ModuleAModule.cs
實現IModule接口(每一個Module類都要實現這個接口,而每一個Module都要有這樣一個類來對Module裏的資源統一管理)
using ModuleA.Views; using Prism.Modularity; using Prism.Regions; namespace ModuleA { public class ModuleAModule : IModule { IRegionManager _regionManager; public ModuleAModule(RegionManager regionManager) { _regionManager = regionManager; } public void Initialize() { _regionManager.RegisterViewWithRegion("ContentRegion", typeof(ViewA)); } } }
他通過View Discovery的方式,將ModuleA的ViewA與_regionManager(這裏是依賴註入)的Region"ContentRegion"進行關聯。
那麽,ModuleCatalog是怎樣讓Shell加載ModuleA的呢?,,???,,
代碼
先在shell所在module添加ModuleA引用,然後:
Bootstrapper.cs
中重寫ConfigureModuleCatalog
:
protected override void ConfigureModuleCatalog()
{
var catalog = (ModuleCatalog)ModuleCatalog;
catalog.AddModule(typeof(ModuleAModule));
}
啊妹子,炒雞簡單有沒有?
配置文件
Bootstrapper.cs
中重寫CreateModuleCatalog
:
protected override IModuleCatalog CreateModuleCatalog()
{
return new ConfigurationModuleCatalog();
}
這表示,ModuleCatalog將從配置文件中創建。
App.config中添加了
<?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>
通過配置文件來配置ModuleCatalog就不需要添加ModuleA引用了
Directory
這個很尷尬,我調試一直不通過,辣雞(●‘?‘●)
LoadManual
Bootstrapper.cs
中重寫ConfigureModuleCatalog
:
protected override void ConfigureModuleCatalog()
{
var moduleAType = typeof(ModuleAModule);
ModuleCatalog.AddModule(new ModuleInfo()
{
ModuleName = moduleAType.Name,
ModuleType = moduleAType.AssemblyQualifiedName,
InitializationMode = InitializationMode.OnDemand
});
}
從PRISM開始學WPF(四)Prism-Module?