Prism学习笔记(三):对Prism中模块化程序的理解。
?????? 這幾天學(xué)習(xí)Prism,看了下幫組文檔和程序。在Prism中專門講解模塊化程序開發(fā)的有倆個列子,一個是用Unity解耦實現(xiàn)Prism的依賴注入,另一個列子是用MEF解耦是實現(xiàn)Prism的依賴注入。
案例(一):ModularityWithUnity.Silverlight
開啟應(yīng)用程序
(1)App.xaml.cs中?
private void Application_Startup(object sender, StartupEventArgs e){
//創(chuàng)建Shell實例,不需要設(shè)置RootVisual
QuickStartBootstrapper bootstrapper = new QuickStartBootstrapper();
bootstrapper.Run();
}
?(2)QuickStartBootstrapper.cs
//實例化Shell//最基本的實現(xiàn),確保Shell被整合到容器中
protected override void InitializeShell()
{
base.InitializeShell();
Application.Current.RootVisual = (UIElement)this.Shell;
}
構(gòu)建模塊
這里以Module A 為例,構(gòu)建Module A,主要實現(xiàn)IModule接口
(1)首先新建Silverlight項目ModuleA
?(2)實現(xiàn)IModule接口
?
View Code namespace ModuleA{
using System;
using Microsoft.Practices.Prism.Logging;
using Microsoft.Practices.Prism.Modularity;
using ModuleTracking;
/// <summary>
/// A module for the quickstart.
/// </summary>
public class ModuleA : IModule
{
private ILoggerFacade logger;
private IModuleTracker moduleTracker;
/// <summary>
/// Initializes a new instance of the <see cref="ModuleA"/> class.
/// </summary>
/// <param name="logger">The logger.</param>
/// <param name="moduleTracker">The module tracker.</param>
public ModuleA(ILoggerFacade logger, IModuleTracker moduleTracker)
{
if (logger == null)
{
throw new ArgumentNullException("logger");
}
if (moduleTracker == null)
{
throw new ArgumentNullException("moduleTracker");
}
this.logger = logger;
this.moduleTracker = moduleTracker;
this.moduleTracker.RecordModuleConstructed(WellKnownModuleNames.ModuleA);
}
/// <summary>
/// Notifies the module that it has be initialized.
/// </summary>
public void Initialize()
{
this.logger.Log("ModuleA demonstrates logging during Initialize().", Category.Info, Priority.Medium);
this.moduleTracker.RecordModuleInitialized(WellKnownModuleNames.ModuleA);
}
}
}
?注冊模塊
注冊模塊有以下3種方式:
??????(1)用代碼注冊模塊
??????(2)用Xaml文件注冊模塊
??????(3)用配置文件注冊模塊(只針對WPF)
下面介紹了用代碼注冊模塊和用xaml文件注冊模塊的再改案例中的實現(xiàn)。
一)用代碼注冊模塊
//用代碼注冊模塊protected override void ConfigureModuleCatalog()
{
// Module A
Type moduleAType = typeof(ModuleA.ModuleA);
this.ModuleCatalog.AddModule(new ModuleInfo(moduleAType.Name, moduleAType.AssemblyQualifiedName, WellKnownModuleNames.ModuleD));
//Module C
Type moduleCType = typeof(ModuleC.ModuleC);
ModuleCatalog.AddModule(new ModuleInfo()
{
ModuleName = moduleCType.Name,
ModuleType = moduleCType.AssemblyQualifiedName,
//指定按需特性
InitializationMode = InitializationMode.OnDemand
});
}
二)用xaml文件注冊模塊:
在ModulesCatalog.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.Prism.Modularity;assembly=Microsoft.Practices.Prism">
<Modularity:ModuleInfoGroup Ref="ModuleB.xap" InitializationMode="WhenAvailable">
<Modularity:ModuleInfo ModuleName="ModuleB" ModuleType="ModuleB.ModuleB, ModuleB, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</Modularity:ModuleInfoGroup>
<Modularity:ModuleInfoGroup InitializationMode="OnDemand">
<Modularity:ModuleInfo Ref="ModuleE.xap" ModuleName="ModuleE" ModuleType="ModuleE.ModuleE, ModuleE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Modularity:ModuleInfo Ref="ModuleF.xap" ModuleName="ModuleF" ModuleType="ModuleF.ModuleF, ModuleF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" >
<Modularity:ModuleInfo.DependsOn>
<sys:String>ModuleE</sys:String>
</Modularity:ModuleInfo.DependsOn>
</Modularity:ModuleInfo>
</Modularity:ModuleInfoGroup>
<!-- Module info without a group -->
<Modularity:ModuleInfo Ref="ModuleD.xap" ModuleName="ModuleD" ModuleType="ModuleD.ModuleD, ModuleD, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</Modularity:ModuleCatalog>
在QuickStartBootstrapper.cs中還要加上這樣一段代碼?
//用Xaml文件注冊模塊(在UnityBootstrapper中)//IModuleCatalog實例用于跟蹤哪些模塊有效,哪些模塊可能需要被下載,哪些模塊已經(jīng)存在
protected override IModuleCatalog CreateModuleCatalog()
{
// Module B, D, E and F
return Modularity.ModuleCatalog.CreateFromXaml(new Uri("/ModularityWithUnity.Silverlight;component/ModulesCatalog.xaml", UriKind.Relative));
}
?加載模塊
(1)Shell響應(yīng)UI通過調(diào)用ModuleManager.LoadModule ,這里以Module C為例說明。在Shell.xaml.cs中
//Shell響應(yīng)來至UI的請求,加載一個模塊通過調(diào)用ModuleManager.LoadModule方法。//ModuleManager用的是異步事件模式
//加載ModuleC
private void ModuleC_RequestModuleLoad(object sender, EventArgs e)
{
this.moduleManager.LoadModule(WellKnownModuleNames.ModuleC);
}
(2)Shell被通知已下載進度,通過訂閱ModuleManager.ModuleDownloadProgressChanged事件,在Shell.xaml.cs中
//跟蹤模塊下載進度void ModuleManager_ModuleDownloadProgressChanged(object sender, ModuleDownloadProgressChangedEventArgs e)
{
this.moduleTracker.RecordModuleDownloading(e.ModuleInfo.ModuleName, e.BytesReceived, e.TotalBytesToReceive);
}
(3)Shell被通知模塊已經(jīng)下載完成并初始化完成,通過訂閱ModuleManager.LoadModuleCompleted事件
//模塊加載完成時促發(fā)的事件//e.IsErrorHandled來只是模塊是否加載成功
void ModuleManager_LoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e)
{
this.moduleTracker.RecordModuleLoaded(e.ModuleInfo.ModuleName);
}
總結(jié)
以上是生活随笔為你收集整理的Prism学习笔记(三):对Prism中模块化程序的理解。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT中封装的IP地址的widget
- 下一篇: [基础|理论|实验]Sizeof与Str