这篇继续介绍Module的功能.

第5篇已经介绍过模块的一些基本功能了,这篇介绍模块在silverlight的特殊应用.

silverlight的项目生成文件是xap文件,其提供了一个非常方便的功能,即相互的xap文件可以相互加载,就如flash的swf文件一样可以动态加载.建议你在看下去之前先看一下TerryLee写的这两篇文章

这里我简单的总结一下silverlight程序初始化的步骤.总目标是要拿到xap里面的UserControl

1.先加载xap文件,xap文件包括一个xaml文件和一堆相关的dll(这里就可以知道dll越多,加载速度越慢了)

2.找到入口点主程序,看Deployment节点的两个属性,一个是程序集,一个是App入口点.然后就可以通过反射初始化了.

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="RemoteModuleLoading.Silverlight" EntryPointType="RemoteModuleLoading.Silverlight.App" RuntimeVersion="2.0.31005.0"><Deployment.Parts><AssemblyPart x:Name="RemoteModuleLoading.Silverlight" Source="RemoteModuleLoading.Silverlight.dll" /><AssemblyPart x:Name="Infrastructure.Silverlight" Source="Infrastructure.Silverlight.dll" /><AssemblyPart x:Name="Microsoft.Practices.Composite.Silverlight" Source="Microsoft.Practices.Composite.Silverlight.dll" /><AssemblyPart x:Name="Microsoft.Practices.Composite.UnityExtensions.Silverlight" Source="Microsoft.Practices.Composite.UnityExtensions.Silverlight.dll" /><AssemblyPart x:Name="Microsoft.Practices.Unity" Source="Microsoft.Practices.Unity.dll" /><AssemblyPart x:Name="Microsoft.Practices.ServiceLocation.Silverlight" Source="Microsoft.Practices.ServiceLocation.Silverlight.dll" /><AssemblyPart x:Name="Microsoft.Practices.Composite.Presentation.Silverlight" Source="Microsoft.Practices.Composite.Presentation.Silverlight.dll" /><AssemblyPart x:Name="System.Windows.Controls" Source="System.Windows.Controls.dll" /></Deployment.Parts>
</Deployment>

那么加载外部的xap文件该如何做呢?

1.先下载好要加载的xap文件

2.然后再读取xap的那个xaml文件

3.反射加载dll文件,拿到我们想要的内容.

我想大致应该是如此,prism对此功能进行了一些封装.让我们来看看prism是如何实现这一功能的.

模块组功能(ModuleInfoGroup)

prism v2添加一个模块组的功能,我们可以来看一下下面的类图关系.

1.ModuleCatalog是一个模块集合,Items是其默认的集合属性,Item的类型是IModuleCatalogItem,该接口是一个空实现,作为一个标识作用,ModuleInfoGroup和ModuleInfo实现了这个接口,这就可以实现同时添加这两个类型到集合里面.

public Collection<IModuleCatalogItem> Items
{get { return items; }
}

那么ModuleCatalog的ModuleInfo集合便是ModuleInfoGroup和ModuleInfo的并集.

以xaml文件代替app.config配置文件来加载模块

.

xaml文件有个好处,可以加载xaml文件,然后可以将在xaml文件转成你需要的对象.这也是这篇要讲的重点.

我们先来看一下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.Composite.Modularity;assembly=Microsoft.Practices.Composite.Silverlight"><Modularity:ModuleInfoGroup Ref="ModuleX.Silverlight.xap" InitializationMode="OnDemand"><Modularity:ModuleInfo ModuleName="ModuleX" ModuleType="ModuleX.ModuleX, ModuleX.Silverlight, Version=1.0.0.0" /></Modularity:ModuleInfoGroup><Modularity:ModuleInfoGroup Ref="ModulesWY.Silverlight.xap" InitializationMode="WhenAvailable"><Modularity:ModuleInfo ModuleName="ModuleY" ModuleType="ModuleY.ModuleY, ModulesWY.Silverlight, Version=1.0.0.0"><Modularity:ModuleInfo.DependsOn><sys:String>ModuleW</sys:String></Modularity:ModuleInfo.DependsOn></Modularity:ModuleInfo><Modularity:ModuleInfo ModuleName="ModuleW" ModuleType="ModuleW.ModuleW, ModulesWY.Silverlight, Version=1.0.0.0"></Modularity:ModuleInfo></Modularity:ModuleInfoGroup><!-- Module info without a group --><Modularity:ModuleInfo Ref="ModuleZ.Silverlight.xap" ModuleName="ModuleZ" ModuleType="ModuleZ.ModuleZ, ModuleZ.Silverlight, Version=1.0.0.0" />
</Modularity:ModuleCatalog>

定义好配置文件以后重写Bootstrapper的GetModuleCatalog方法,这个Bootstrapper已经提很多遍了,用ModuleCatalog的静态方法CreateFromXaml创建IModuleCatalog对象

protected override IModuleCatalog GetModuleCatalog()
{returnModuleCatalog.CreateFromXaml(new Uri("/RemoteModuleLoading.Silverlight;component/ModulesCatalog.xaml", UriKind.Relative));
}

Xap模块加载器

在模块初始化的时候,有一个IModuleTypeLoader的接口,该接口在wpf和silverlight的实现不同.

wpf的实现就直接去加载dll即可.silverlight的实现刚开始上面已经解释过了

下载xap==>扫描xaml文件的ModuleDeployment的Parts的配置,加载dll==>反射加载UserControl

上面步骤我已经重复讲了3遍了.prism的XapModuleTypeLoader类实现了这个接口.

定义ModuleDeployment配置文件

silverlight主程序默认会产生一个AppManifest的页面用于配置dll文件,但自定义的模块类库,没有这个文件.当读取xap以后,我们还需要定义一个配置文件来读取xap的dll文件.这里由于主程序并没有引用外部要加载的xap文件,所以是认不出来有什么dll的,定这个配置文件就是为读取dll而准备的.

在每个模块中,这个配置文件名字必须是叫ModuleManifest.xaml.这个名字是定死的,XapModuleTypeLoader类硬编码会读取这个文件.如下

<Modularity:ModuleDeploymentxmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:Modularity="clr-namespace:Microsoft.Practices.Composite.Modularity;assembly=Microsoft.Practices.Composite.Silverlight"><Modularity:ModuleDeployment.Parts><AssemblyPart Source="ModuleZ.Silverlight.dll" /></Modularity:ModuleDeployment.Parts>
</Modularity:ModuleDeployment>

dll加载完毕以后就会去初始化实现IModule的类了.好了,这篇专门介绍了prism在silverlight应用中,加载xap文件的配置方式.希望对你有帮助.

prism v2之旅(7)相关推荐

  1. Prism V2之旅(1)

    概述 如果你在开发wpf程序,应该听说过The Composite Application Guidance for WPF(以下简称prism) 总而言之,prism是帮助你开发复杂的wpf应用程序 ...

  2. Silverlight 和WPF的Composite Guidance(Prism V2)发布了

    Microsoft 模式和实施方案小组最近发布了第二个版本的"WPF 复合应用程序指南",这一新指南旨在充分利用 WPF/Silverlight 的功能和编程模型.同时,团队还根据 ...

  3. wpf silverlight开发框架(prism)系列教程

    弄个列表,方便你我,不要问我prism是啥,只要你做wpf or silverlight你就会知道这个东西. Prism V2之旅(1)-prism基本概览 让你了解下,prism里面的一些基本概念 ...

  4. 浅谈MVP与Model-View-ViewModel(MVVM)设计模式

     微软的WPF带来了新的技术体验,如Sliverlight.音频.视频.3D.动画--,这导致了软件UI层更加细节化.可定制化.同时,在技术层面,WPF也带来了诸如Binding.Dependency ...

  5. 分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(12月26日-1月1日)

    分享Silverlight/WPF/Windows Phone/HTML5一周学习导读(12月26日-1月1日) 本周Silverlight学习资源更新   vs2010 学习Silverlight学 ...

  6. 【踩坑之旅】-webpack (v4.8.1) + vue-cli (v2.5.3)升级准备

    2019独角兽企业重金招聘Python工程师标准>>> 一.重见天日 error in ./src/App.vue?vue&type=style&index=0&am ...

  7. 我的WCF之旅(7):面向服务架构(SOA)和面向对象编程(OOP)的结合——如何实现Service Contract的继承...

    当今的IT领域,SOA已经成为了一个非常时髦的词,对SOA风靡的程度已经让很多人对SOA,对面向服务产生误解.其中很大一部分人甚至认为面向服务将是面向对象的终结,现在的面向对象将会被面向服务完全代替. ...

  8. C#发现之旅第十四讲 基于动态编译的VB.NET脚本引擎

    本章说明 在前面章节中,笔者使用了反射和动态编译技术实现了快速ORM框架,在本章中笔者将继续使用这些技术来实现一个VB.NET的脚本引擎,使得人们在开发中能实现类似MS Office那样实现VBA宏的 ...

  9. LINKs: Xamarin.Forms + Prism

    LINK 1 - How to use Prism with Xamarin.Forms http://brianlagunas.com/first-look-at-the-prism-for-xam ...

最新文章

  1. 【直播】王茂霖:二手车交易价格预测-千变万化特征工程(河北高校数据挖掘邀请赛)
  2. 从零开始一起学习SLAM | 不推公式,如何真正理解对极约束?
  3. 用pv操作描述如下前驱图_跟我学PMP | PV、AC、EV…挣值管理的基本概念都是啥?...
  4. 4.mysql数据库创建,表创建模等模板脚本,mysql_SQL99标准的连接查询(内连接,外连接,满外连接,交叉连接)
  5. 下载开发证书步骤(自用备忘)
  6. python参数传递时不构造新数据对象_关于函数的参数传递(parameter passing),以下选项中描述错误的是_学小易找答案...
  7. CANOpen同步报文
  8. ggplot2作图详解:主题(theme)设置
  9. MikroTik(RouteOS)有线路由器快速设置教程
  10. XR迈向10亿级必须解决的3个问题
  11. 数据分析技术:时间序列分析的AR/MA/ARMA/ARIMA模型体系
  12. 【arcgis符号库使用教程】
  13. 密码学实验题_03.3_AES实验_利用Sage构建AES的S盒和逆S盒(基于阅读Sage数学库的Python代码)
  14. Windows下Armadillo配置及测试
  15. 利用计算机卸载,为什么我不能在计算机上卸载软件! !
  16. pytorch学习-从入门到mnist(一)
  17. 史上最全交互设计原则(三)之奥卡姆剃刀原理
  18. Neo4j / Cypher语言学习
  19. Synopsys Sentaurus TCAD系列教程之-- Sdevice《5》Plot模块
  20. DNS分离解析 RAID磁盘阵列 进程管理 系统日志分析

热门文章

  1. MATLAB 画图 x轴换成 字符串
  2. winform利用html开发,.NET使用Cefsharp开发winform项目入门示例
  3. 织梦自定义html文本,织梦内容模型自定义字段及调用方法
  4. linux系统查看服务进程,Linux服务器系统详细查看进程启动时间
  5. new函数的底层实现
  6. ubuntu中的大小写
  7. 谈一下ACM的入门书籍及方法
  8. 【java】JOptionPane的几种方法的作用
  9. AI学习笔记(十一)CNN之图像识别(下)
  10. 2d游戏地图编辑器_C语言实现大型2D格斗游戏,1.8万行代码!