1. 程式人生 > >prism v2之旅(7)

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檔案的配置方式.希望對你有幫助.