Prism應用開發(三)——基於模塊的應用程序開發

Prism使用模塊(Module)的概念來對應用程序進行劃分。一個module封裝相關的關注點,並且具有單一的職責。module既可以按照應用程序的業務邏輯進行劃分,也可以按照應用程序的架構層次進行劃分。很多大型應用可能會同時包含兩種類型的Module。

下圖中,按照應用程序的業務邏輯進行模塊劃分:


下圖中,按照應用程序的架構層次進行模塊劃分:


下面是設計模塊的一些例子:

  • 一個模塊可以是包含應用程序特定的業務邏輯的模塊。
  • 一個模塊可以是包含應用程序基礎服務的模塊,比如logging, caching, authorization 服務。
  • 一個模塊可以是調用其它系統的模塊。

總之,模塊並不一定只能按照業務邏輯進行劃分,它可以是一個很靈活的設計。

兩個模塊之間應該是最小依賴,如果一個模塊依賴另一個模塊,應該通過鬆耦合的方式,使其都依賴於定義在shared library中的接口或者使用EventAggregator的方式進行通信。

一、定義Module

public class MyModule : IModule
{
public void Initialize()
{
// Initialize module
}
}

二、註冊Module

可以有三種方式註冊Module:代碼方式、XAML方式和配置文件方式。

代碼方式:

protected override void ConfigureModuleCatalog()
{
Type moduleCType = typeof(ModuleC);
ModuleCatalog.AddModule(
new ModuleInfo()
{
ModuleName = moduleCType.Name,
ModuleType = moduleCType.AssemblyQualifiedName,
});
}
XAML方式:

<Modularity:ModuleCatalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices
.Prism">
<Modularity:ModuleInfoGroup Ref="ModuleB.xap" InitializationMode="WhenAvailable">
<Modularity:ModuleInfo ModuleName="ModuleB" ModuleType="ModuleB.ModuleB, ModuleB,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</Modularity:ModuleInfoGroup>
<Modularity:ModuleInfoGroup InitializationMode="OnDemand">
<Modularity:ModuleInfo Ref="ModuleE.xap" ModuleName="ModuleE"
ModuleType="ModuleE.ModuleE, ModuleE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Modularity:ModuleInfo Ref="ModuleF.xap" ModuleName="ModuleF"
ModuleType="ModuleF.ModuleF, ModuleF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" >
<Modularity:ModuleInfo.DependsOn>
<sys:String>ModuleE</sys:String>
</Modularity:ModuleInfo.DependsOn>
</Modularity:ModuleInfo>
</Modularity:ModuleInfoGroup>
<!-- Module info without a group -->
<Modularity:ModuleInfo Ref="ModuleD.xap" ModuleName="ModuleD" ModuleType="ModuleD.ModuleD,
ModuleD, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</Modularity:ModuleCatalog>

protected override IModuleCatalog CreateModuleCatalog()
{
return ModuleCatalog.CreateFromXaml(new
Uri("/MyProject.Silverlight;component/ModulesCatalog.xaml",
UriKind.Relative));
}

配置文件方式:

<modules>
<module assemblyFile="ModularityWithUnity.Desktop.ModuleE.dll"
moduleType="ModularityWithUnity.Desktop.ModuleE, ModularityWithUnity.Desktop.ModuleE,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleE" startupLoaded="false"
/>
<module assemblyFile="ModularityWithUnity.Desktop.ModuleF.dll"
moduleType="ModularityWithUnity.Desktop.ModuleF, ModularityWithUnity.Desktop.ModuleF,
Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" moduleName="ModuleF"
startupLoaded="false">
<dependencies>
<dependency moduleName="ModuleE"/>
</dependencies>
</module>
</modules>

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

三、發現模塊

Prism的DirectoryModuleCatalog類允許指定一個文件夾作爲Module Catalog,這個Module Catalog將會掃描文件夾下的所有程序集,從而找到所有的Module,要使用這個特性,需要爲Module類指定Attribute來聲明模塊的名字以及它的依賴模塊。

protected override IModuleCatalog CreateModuleCatalog()
{
return new DirectoryModuleCatalog() {ModulePath = @".\Modules"};
}

四、模塊依賴

模塊允許依賴於其它模塊,如果模塊A依賴於模塊B,模塊B必須在模塊A之前初始化,ModuleManager會track這些依賴然後相應的初始化模塊。有三種方式指明模塊依賴:代碼方式、XAML方式和配置文件方式。

[Module(ModuleName = "ModuleA")]
[ModuleDependency("ModuleD")]
public class ModuleA: IModule
{
...
}
<Modularity:ModuleInfo Ref="ModuleF.xap" ModuleName="ModuleF" ModuleType="ModuleF.ModuleF,
ModuleF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" >
<Modularity:ModuleInfo.DependsOn>
<sys:String>ModuleE</sys:String>
</Modularity:ModuleInfo.DependsOn>
</Modularity:ModuleInfo>

<modules>
<module assemblyFile="Modules/ModuleD.dll" moduleType="ModuleD.ModuleD, ModuleD"
moduleName="ModuleD">
<dependencies>
<dependency moduleName="ModuleB"/>
</dependencies>
</module>

五、On Demand模式載入模塊

要實現OnDemand模式載入模塊,需要做下面兩個步驟:

1)聲明模塊的初始化模式是OnDemand。

2)在應用程序代碼裏請求模塊載入,使用IModuleManager的LoadModule方法可以載入相應模塊。

聲明OnDemand初始化模式同樣有三種方式:代碼方式、XAML方式和配置文件方式:

protected override void ConfigureModuleCatalog()
{
Type moduleCType = typeof(ModuleC);
this.ModuleCatalog.AddModule(new ModuleInfo()
{
ModuleName = moduleCType.Name,
ModuleType = moduleCType.AssemblyQualifiedName,
InitializationMode = InitializationMode.OnDemand
});
}

<Modularity:ModuleInfoGroup InitializationMode="OnDemand">
<Modularity:ModuleInfo Ref="ModuleE.xap" ModuleName="ModuleE"
ModuleType="ModuleE.ModuleE, ModuleE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />

<module assemblyFile="Modules/ModuleC.dll" moduleType="ModuleC.ModuleC, ModuleC"
moduleName="ModuleC" startupLoaded="false"/>

發佈了71 篇原創文章 · 獲贊 13 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章