Prism应用开发(三)——基于模块的应用程序开发

Prism使用模块(Module)的概念来对应用程序进行划分。一个module封装相关的关注点,并且具有单一的职责。module既可以按照应用程序的业务逻辑进行划分,也可以按照应用程序的架构层次进行划分。很多大型应用可能会同时包含两种类型的Module。

下图中,按照应用程序的业务逻辑进行模块划分:


下图中,按照应用程序的架构层次进行模块划分:


下面是设计模块的一些例子:

  • 一个模块可以是包含应用程序特定的业务逻辑的模块。
  • 一个模块可以是包含应用程序基础服务的模块,比如logging, caching, authorization 服务。
  • 一个模块可以是调用其它系统的模块。

总之,模块并不一定只能按照业务逻辑进行划分,它可以是一个很灵活的设计。

两个模块之间应该是最小依赖,如果一个模块依赖另一个模块,应该通过松耦合的方式,使其都依赖于定义在shared library中的接口或者使用EventAggregator的方式进行通信。

一、定义Module

  1. public class MyModule : IModule  
  2. {  
  3. public void Initialize()  
  4. {  
  5. // Initialize module  
  6. }  
  7. }  
public class MyModule : IModule
{
public void Initialize()
{
// Initialize module
}
}

二、注册Module

可以有三种方式注册Module:代码方式、XAML方式和配置文件方式。

代码方式:

  1. protected override void ConfigureModuleCatalog()  
  2. {  
  3. Type moduleCType = typeof(ModuleC);  
  4. ModuleCatalog.AddModule(  
  5. new ModuleInfo()  
  6. {  
  7. ModuleName = moduleCType.Name,  
  8. ModuleType = moduleCType.AssemblyQualifiedName,  
  9. });  
  10. }  
protected override void ConfigureModuleCatalog()
{
Type moduleCType = typeof(ModuleC);
ModuleCatalog.AddModule(
new ModuleInfo()
{
ModuleName = moduleCType.Name,
ModuleType = moduleCType.AssemblyQualifiedName,
});
}
XAML方式:

  1. <Modularity:ModuleCatalog xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
  2. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
  3. xmlns:sys="clr-namespace:System;assembly=mscorlib"  
  4. xmlns:Modularity="clr-namespace:Microsoft.Practices.Prism.Modularity;assembly=Microsoft.Practices  
  5. .Prism">  
  6. <Modularity:ModuleInfoGroup Ref="ModuleB.xap" InitializationMode="WhenAvailable">  
  7. <Modularity:ModuleInfo ModuleName="ModuleB" ModuleType="ModuleB.ModuleB, ModuleB,  
  8. Version=1.0.0.0, Culture=neutralPublicKeyToken=null/>  
  9. </Modularity:ModuleInfoGroup>  
  10. <Modularity:ModuleInfoGroup InitializationMode="OnDemand">  
  11. <Modularity:ModuleInfo Ref="ModuleE.xap" ModuleName="ModuleE"  
  12. ModuleType="ModuleE.ModuleE, ModuleE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />  
  13. <Modularity:ModuleInfo Ref="ModuleF.xap" ModuleName="ModuleF"  
  14. ModuleType="ModuleF.ModuleF, ModuleF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" >  
  15. <Modularity:ModuleInfo.DependsOn>  
  16. <sys:String>ModuleE</sys:String>  
  17. </Modularity:ModuleInfo.DependsOn>  
  18. </Modularity:ModuleInfo>  
  19. </Modularity:ModuleInfoGroup>  
  20. <!-- Module info without a group -->  
  21. <Modularity:ModuleInfo Ref="ModuleD.xap" ModuleName="ModuleD" ModuleType="ModuleD.ModuleD,  
  22. ModuleD, Version=1.0.0.0, Culture=neutralPublicKeyToken=null/>  
  23. </Modularity:ModuleCatalog>  
<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>

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

配置文件方式:

  1. <modules>  
  2. <module assemblyFile="ModularityWithUnity.Desktop.ModuleE.dll"  
  3. moduleType="ModularityWithUnity.Desktop.ModuleE, ModularityWithUnity.Desktop.ModuleE,  
  4. Version=1.0.0.0, Culture=neutralPublicKeyToken=null" moduleName="ModuleE" startupLoaded="false"  
  5. />  
  6. <module assemblyFile="ModularityWithUnity.Desktop.ModuleF.dll"  
  7. moduleType="ModularityWithUnity.Desktop.ModuleF, ModularityWithUnity.Desktop.ModuleF,  
  8. Version=1.0.0.0, Culture=neutralPublicKeyToken=null" moduleName="ModuleF"  
  9. startupLoaded="false">  
  10. <dependencies>  
  11. <dependency moduleName="ModuleE"/>  
  12. </dependencies>  
  13. </module>  
  14. </modules>  
<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>

  1. protected override IModuleCatalog CreateModuleCatalog()  
  2. {  
  3. return new ConfigurationModuleCatalog();  
  4. }  
protected override IModuleCatalog CreateModuleCatalog()
{
return new ConfigurationModuleCatalog();
}

三、发现模块

Prism的DirectoryModuleCatalog类允许指定一个文件夹作为Module Catalog,这个Module Catalog将会扫描文件夹下的所有程序集,从而找到所有的Module,要使用这个特性,需要为Module类指定Attribute来声明模块的名字以及它的依赖模块。

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

四、模块依赖

模块允许依赖于其它模块,如果模块A依赖于模块B,模块B必须在模块A之前初始化,ModuleManager会track这些依赖然后相应的初始化模块。有三种方式指明模块依赖:代码方式、XAML方式和配置文件方式。

  1. [Module(ModuleName = "ModuleA")]  
  2. [ModuleDependency("ModuleD")]  
  3. public class ModuleA: IModule  
  4. {  
  5. ...  
  6. }  
[Module(ModuleName = "ModuleA")]
[ModuleDependency("ModuleD")]
public class ModuleA: IModule
{
...
}
  1. <Modularity:ModuleInfo Ref="ModuleF.xap" ModuleName="ModuleF" ModuleType="ModuleF.ModuleF,  
  2. ModuleF, Version=1.0.0.0, Culture=neutralPublicKeyToken=null>  
  3. <Modularity:ModuleInfo.DependsOn>  
  4. <sys:String>ModuleE</sys:String>  
  5. </Modularity:ModuleInfo.DependsOn>  
  6. </Modularity:ModuleInfo>  
<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>

  1. <modules>  
  2. <module assemblyFile="Modules/ModuleD.dll" moduleType="ModuleD.ModuleD, ModuleD"  
  3. moduleName="ModuleD">  
  4. <dependencies>  
  5. <dependency moduleName="ModuleB"/>  
  6. </dependencies>  
  7. </module>  
<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方式和配置文件方式:

  1. protected override void ConfigureModuleCatalog()  
  2. {  
  3. Type moduleCType = typeof(ModuleC);  
  4. this.ModuleCatalog.AddModule(new ModuleInfo()  
  5. {  
  6. ModuleName = moduleCType.Name,  
  7. ModuleType = moduleCType.AssemblyQualifiedName,  
  8. InitializationMode = InitializationMode.OnDemand  
  9. });  
  10. }  
protected override void ConfigureModuleCatalog()
{
Type moduleCType = typeof(ModuleC);
this.ModuleCatalog.AddModule(new ModuleInfo()
{
ModuleName = moduleCType.Name,
ModuleType = moduleCType.AssemblyQualifiedName,
InitializationMode = InitializationMode.OnDemand
});
}

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值