zoukankan      html  css  js  c++  java
  • 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文件的配置方式.希望对你有帮助.

  • 相关阅读:
    HDU5418.Victor and World(状压DP)
    POJ2686 Traveling by Stagecoach(状压DP)
    POJ3254Corn Fields(状压DP)
    HDU5407.CRB and Candies(数论)
    CodeForces 352D. Jeff and Furik
    CodeForces 352C. Jeff and Rounding(贪心)
    LightOj 1282 Leading and Trailing
    Ural 1057. Amount of Degrees(数位DP)
    HDU 2089 不要62 (数位DP)
    HDU5366 The mook jong (DP)
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/prism_part7.html
Copyright © 2011-2022 走看看