天天看點

從PRISM開始學WPF(四)Prism-Module?

原文: 從PRISM開始學WPF(四)Prism-Module? 從PRISM開始學WPF(一)WPF? 從PRISM開始學WPF(二)Prism? 從PRISM開始學WPF(三)Prism-Region? 從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
            });
        }