silverlight   发布时间:2022-05-04  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了prism v2之旅(7)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

   这篇继续介绍Module的功能. 第5篇已经介绍过模块的一些基本功能了,这篇介绍模块在silverlight的特殊应用. silverlight的项目生成文件是xap文件,其提供了一个非常方便的功能,即相互的xap文件可以相互加载,就如flash的swf文件一样可以动态加载.建议你在看下去之前先看一下TerryLee写的这两篇文章 这里我简单的总结一下silverlight程序初始化的步骤.

   这篇继续介绍Module的功能.

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

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

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

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

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

<Deployment xmlns="http://scheR_36_11845@as.microsoft.com/client/2007/deployment" xmlns:x="http://scheR_36_11845@as.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添加一个模块组的功能,我们可以来看一下下面的类图关系.

prism v2之旅(7)

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的配置文件

<@H_331_35@modularity:@H_331_35@moduleCatalog xmlns="http://scheR_36_11845@as.microsoft.com/winfx/2006/xaml/presentation"
               xmlns:x="http://scheR_36_11845@as.microsoft.com/winfx/2006/xaml"
                xmlns:sys="clr-namespace:System;assembly=mscorlib"
               xmlns:@H_743_37@modularity="clr-namespace:Microsoft.Practices.Composite.Modularity;assembly=Microsoft.Practices.Composite.Silverlight">
    <@H_331_35@modularity:@H_331_35@moduleInfoGroup Ref="ModuleX.Silverlight.xap" InitializationMode="ondemand">
        <@H_331_35@modularity:@H_331_35@moduleInfo @H_743_37@modulename="ModuleX" @H_743_37@moduleType="ModuleX.ModuleX,ModuleX.Silverlight,Version=1.0.0.0" />
    </@H_331_35@modularity:@H_331_35@moduleInfoGroup>
    <@H_331_35@modularity:@H_331_35@moduleInfoGroup Ref="ModulesWY.Silverlight.xap" InitializationMode="WhenAvailable">
        <@H_331_35@modularity:@H_331_35@moduleInfo @H_743_37@modulename="ModuleY" 
                               @H_743_37@moduleType="ModuleY.ModuleY,ModulesWY.Silverlight,Version=1.0.0.0">
            <@H_331_35@modularity:@H_331_35@moduleInfo.DependsOn>
                <sys:String>@H_331_35@moduleW</sys:String>
            </@H_331_35@modularity:@H_331_35@moduleInfo.DependsOn>
        </@H_331_35@modularity:@H_331_35@moduleInfo>
        <@H_331_35@modularity:@H_331_35@moduleInfo @H_743_37@modulename="ModuleW" 
                               @H_743_37@moduleType="ModuleW.ModuleW,Version=1.0.0.0">
        </@H_331_35@modularity:@H_331_35@moduleInfo>
    </@H_331_35@modularity:@H_331_35@moduleInfoGroup>
    <!-- Module info without a group -->
    <@H_331_35@modularity:@H_331_35@moduleInfo Ref="ModuleZ.Silverlight.xap" @H_743_37@modulename="ModuleZ" 
                           @H_743_37@moduleType="ModuleZ.ModuleZ,ModuleZ.Silverlight,Version=1.0.0.0" />
</@H_331_35@modularity:@H_331_35@moduleCatalog>

 

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

protected override IModuleCatalog GetModuleCatalog()
{
    return
        @H_690_211@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而准备的.

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

<@H_331_35@modularity:@H_331_35@moduleDeployment
    xmlns="http://scheR_36_11845@as.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://scheR_36_11845@as.microsoft.com/winfx/2006/xaml"
    xmlns:@H_743_37@modularity="clr-namespace:Microsoft.Practices.Composite.Modularity;assembly=Microsoft.Practices.Composite.Silverlight">
  <@H_331_35@modularity:@H_331_35@moduleDeployment.Parts>
    <AssemblyPart source="ModuleZ.Silverlight.dll" />
  </@H_331_35@modularity:@H_331_35@moduleDeployment.Parts>
</@H_331_35@modularity:@H_331_35@moduleDeployment>

 

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

大佬总结

以上是大佬教程为你收集整理的prism v2之旅(7)全部内容,希望文章能够帮你解决prism v2之旅(7)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。