`
clingingboy
  • 浏览: 26496 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

prism v2之旅(7)

阅读更多

   这篇继续介绍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添加一个模块组的功能,我们可以来看一下下面的类图关系.

image

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()
{
    return
        ModuleCatalog.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:ModuleDeployment
    xmlns="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 Manual.pdf Prism8框架官方手册 MD 文件转pdf

    Prism框架可以在Windows 8桌面、Windows 7、Windows Vista或Windows Server 2008等操作系统上运行。为确保兼容性和新功能的使用,WPF应用程序应该使用.NET Framework 4.5或更高版本构建。因此,安装以下必要软件是...

    GraphPad Prism 7教程

    GraphPad Prism 7是一款专门用于科学数据分析和作图的软件,它能够帮助科研工作者快速制作出用于学术论文中的高质量图表。GraphPad Prism 7的教程内容包含了软件的基本操作介绍、图表类型的选择、数据的输入方式、...

    Prism经典案例,Prism经典应用

    1. **模块化(Modularity)**:Prism的核心特性之一是模块化,它允许将大型应用程序分解为小的、独立的模块,每个模块都有自己的功能。这样可以提高代码的可重用性,使得开发和维护变得更加容易。在示例中,你可能会...

    WPF Prism实例(多个实例包含Prism各个重要概念实例)

    **Prism是什么** Prism是微软 Patterns & Practices 团队开发的一个开源框架,主要用于构建Windows Presentation Foundation (WPF)和Universal Windows Platform (UWP)应用。它提供了多种设计模式和最佳实践,帮助...

    graph pad prism 7 windows

    Graphpad prism7 windows 安装包

    C#Prism 例子与源码

    Prism 的核心特性之一是模块化。模块化允许将大型应用程序分解为小的、独立的功能单元,每个单元称为模块。这样可以分别开发、测试和部署这些模块,提高代码的复用性和可维护性。文件名 "Prism-7.2.0.1422" 可能包含...

    GraphPad Prism 7医学绘图软件.rar

    GraphPad Prism 7医学绘图软件

    prism模板 vs插件

    prism模板 vs插件

    GraphPad Prism 7

    Graphpad prism 7是Graphpad推出的最新版本,作为知名的医学绘图软件,Graphpad prism 7在原来几基础上作出了更多种类的统计分析,使用更多种类的图,组织你的数据和更大的灵活性,但是prism还是prism,您同样可以...

    prism7_3932.zip

    在绘图方面,Prism的强大之处在于它的图形库。软件内置了大量的图形模板,包括柱状图、箱线图、散点图、热图、生存曲线等,用户可以根据自己的数据类型和研究目的选择合适的图形。这些图形不仅可以自定义颜色、样式...

    Prism.Maui-master.zip

    7. **页面和容器的生命周期管理**:Prism.Maui 包含对 .NET MAUI 页面和容器生命周期事件的支持,如 OnAppearing、OnDisappearing 等,帮助开发者正确处理页面状态和资源。 8. **页面逻辑和视图的解耦**:通过数据...

    Prism7.1.0.431_WPF_官方中文文档

    7. **附加属性**:Prism提供了一系列附加属性,如Behavior、TriggerAction等,用于扩展XAML,让UI元素的行为更丰富。 8. **视图模型定位**:Prism实现了自动视图模型定位,根据视图的名称自动找到对应的视图模型,...

    Prism 4.0安装包

    7. 代理路由(Proxy Routing):对于网络应用,代理路由允许模块在加载时根据网络条件选择不同的加载策略。 在Prism 4.0中,`Prismv4.exe`是安装程序,用于在开发环境中安装所需的类库和工具。一旦安装完成,开发者...

    Delphi Prism Xe Crack

    1. Install Delphi Prism Xe with key:MAAF-SPD7DK-BLAGAD-FEBN 2. Copy PrismXe.slip to C:\Program Files\Embarcadero\Delphi Prism\License 3. Copy sanctuarylib.dll to C:\Program Files\Embarcadero\Delphi ...

    WPF Prism 可关闭的TabControl

    在本文中,我们将深入探讨如何在WPF应用中利用Prism框架实现一个可关闭的TabControl。WPF(Windows Presentation Foundation)是.NET Framework的一部分,提供了一种强大的方式来构建丰富的、具有图形用户界面的应用...

    C#+WPF+Prism模块化开发示例

    7. **配置文件**:可能包含模块配置信息,如模块名称、依赖项等。 通过学习和实践这个`C#+WPF+Prism模块化开发示例`,开发者能够更好地理解如何利用Prism实现模块化设计,提高代码质量和可维护性,同时也能掌握WPF...

    Graphpad-Prism5中文教程

    GraphPad Prism 5.0 中文教程 GraphPad Prism 5.0 是一个功能强大的数据分析和图形化工具,它可以帮助用户快速、准确地处理和可视化数据。在本教程中,我们将详细介绍 GraphPad Prism 5.0 的使用方法和技巧,从...

    Prism7.1.0.431_WPF_官方中文文档.docx

    - **复杂性**:随着功能增加,应用程序的复杂性也随之增加,导致维护困难。 - **可扩展性**:随着需求变化,需要能够轻松添加新功能或修改现有功能。 - **测试**:大型应用的测试变得困难,需要有效的单元测试和集成...

    GraphPad Prism 5.0 usb免安装版

    GraphPad Prism 是一个包括基础生命统计、曲线匹配和科学作图的强大结合体。在一百多个国家有超过 10 万个科学家正在试用 Prism 来分析、绘图和呈现他们的科学数据。 是什么令许多世界上领先的大学、医学中心、研究...

    GraphPad_Prism7.0.zip

    1. Unzip app from Prism 7.0a [k].zip. 2. Launch, enter serial number: GPS-1234567-GZZZ-2D71F ...Enter this Activation code: ACTGP-8EFD3AD7-FB6967B6-95B1249F-57B35DDB Finish activation. If program boun

Global site tag (gtag.js) - Google Analytics