日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Prism学习笔记(三):对Prism中模块化程序的理解。

發布時間:2025/4/5 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Prism学习笔记(三):对Prism中模块化程序的理解。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?????? 這幾天學習Prism,看了下幫組文檔和程序。在Prism中專門講解模塊化程序開發的有倆個列子,一個是用Unity解耦實現Prism的依賴注入,另一個列子是用MEF解耦是實現Prism的依賴注入。

案例(一):ModularityWithUnity.Silverlight

開啟應用程序

(1)App.xaml.cs中?

private void Application_Startup(object sender, StartupEventArgs e)
{
//創建Shell實例,不需要設置RootVisual
QuickStartBootstrapper bootstrapper = new QuickStartBootstrapper();
bootstrapper.Run();
}

?(2)QuickStartBootstrapper.cs

//實例化Shell
//最基本的實現,確保Shell被整合到容器中
protected override void InitializeShell()
{
base.InitializeShell();

Application.Current.RootVisual
= (UIElement)this.Shell;
}

構建模塊

這里以Module A 為例,構建Module A,主要實現IModule接口

(1)首先新建Silverlight項目ModuleA

?(2)實現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文件注冊模塊的再改案例中的實現。

一)用代碼注冊模塊

//用代碼注冊模塊
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實例用于跟蹤哪些模塊有效,哪些模塊可能需要被下載,哪些模塊已經存在
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響應UI通過調用ModuleManager.LoadModule ,這里以Module C為例說明。在Shell.xaml.cs中

//Shell響應來至UI的請求,加載一個模塊通過調用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被通知模塊已經下載完成并初始化完成,通過訂閱ModuleManager.LoadModuleCompleted事件

//模塊加載完成時促發的事件
//e.IsErrorHandled來只是模塊是否加載成功
void ModuleManager_LoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e)
{
this.moduleTracker.RecordModuleLoaded(e.ModuleInfo.ModuleName);
}

總結

以上是生活随笔為你收集整理的Prism学习笔记(三):对Prism中模块化程序的理解。的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。