当前位置:编程学习 > 网站相关 >>

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

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

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

下面是设计模块的一些例子:
一个模块可以是包含应用程序特定的业务逻辑的模块。
一个模块可以是包含应用程序基础服务的模块,比如logging, caching, authorization 服务。
一个模块可以是调用其它系统的模块。
总之,模块并不一定只能按照业务逻辑进行划分,它可以是一个很灵活的设计。
两个模块之间应该是最小依赖,如果一个模块依赖另一个模块,应该通过松耦合的方式,使其都依赖于定义在shared library中的接口或者使用EventAggregator的方式进行通信。
一、定义Module
[csharp] 
public class MyModule : IModule 

public void Initialize() 

// Initialize module 

二、注册Module
可以有三种方式注册Module:代码方式、XAML方式和配置文件方式。
代码方式:
[csharp]
protected override void ConfigureModuleCatalog() 

Type moduleCType = typeof(ModuleC); 
ModuleCatalog.AddModule( 
new ModuleInfo() 

ModuleName = moduleCType.Name, 
ModuleType = moduleCType.AssemblyQualifiedName, 
}); 

XAML方式:
[html] 
<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> 

[csharp] 
protected override IModuleCatalog CreateModuleCatalog() 

return ModuleCatalog.CreateFromXaml(new 
Uri("/MyProject.Silverlight;component/ModulesCatalog.xaml", 
UriKind.Relative)); 

配置文件方式:
[html]
<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> 

[csharp] 
protected override IModuleCatalog CreateModuleCatalog() 

return new ConfigurationModuleCatalog(); 

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

return new DirectoryModuleCatalog() {ModulePath = @".\Modules"}; 

四、模块依赖
模块允许依赖于其它模块,如果模块A依赖于模块B,模块B必须在模块A之前初始化,ModuleManager会track这些依赖然后相应的初始化模块。有三种方式指明模块依赖:代码方式、XAML方式和配置文件方式。
[csharp] 
[Module(ModuleName = "ModuleA")] 
[ModuleDependency("ModuleD")] 
public class ModuleA: IModule 

... 

[html] 
<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> 

[html] 
<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方式和配置文件方式:
[csharp] 
protected override void ConfigureModuleCatalog() 

Type moduleCType = typeof(ModuleC); 
this.ModuleCatalog.AddModule(new ModuleInfo() 

ModuleName = moduleCType.Name, 
ModuleType = moduleCType.AssemblyQualifiedName, 
InitializationMode = InitializationMode.OnDemand 
}); 

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

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

作者:wangchongcy
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,