前面的博客介紹了:
博客園原文地址 : 學習之模塊架構 DotNetNuke 6
這篇博客主要是講模塊的架構和加載,以及模塊與DotNetNuke門戶網站(Portals)系統的關系。充分了解模塊可以幫助DNN開發者根據需要更清晰的構建模塊。
在DNN中,模塊是一個可插入的用戶接口組件,用來處理請求並生成動態的內容。它只能出現在ASP.NET頁面上,而頁面可以包括任意數量的模塊"實例"。
整個模塊架構包括四個部分 : 門戶網站(Portal),頁面(Tab),模塊(Module)和模塊容器(Container)。
- 門戶網站(Portal)
Portal可以定義為一個基於Web的應用程序,從不同的源聚集內容,並寄宿信息系統的表示層(模塊)。下圖描述了Portal的基本架構,DNN處理頁面請求時需要執行許多步驟。下述步驟在頁面初始化的過程中執行,用來在運行時動態地加載模塊。動態創建的模塊然后就能夠處理它們自己的生存周期,包括諸如初始化、加載、呈現等各種事件。
圖一 : Portal的基本架構
第一步: 頁面配置檢索(Page Configuration Retrieval)
第1步就是為被請求的頁面檢索模塊。檢索步驟由許多重要的信息塊構成,例如頁面上出現的各個模塊、模塊在頁面上顯示的區域(即內容窗格Pane),以及與每個模塊相關聯的安全角色。
//Default.aspx.cs
//OnInit
//load skin control and register UI js
UI.Skins.Skin ctlSkin = UI.Skins.Skin.GetSkin(this);
//add skin to page
SkinPlaceHolder.Controls.Add(ctlSkin);
//DotNetNuke.UI.Skins.Skin.cs : OnInit()
bool success;
//Load the Module Control(s)
success = Globals.IsAdminControl() ? ProcessSlaveModule() : ProcessMasterModules();
//DotNetNuke.UI.Skins.Skin.cs : ProcessMasterModules()
bool success = true;
if (TabPermissionController.CanViewPage())
{
//check portal expiry date
if (!CheckExpired())
{
if ((PortalSettings.ActiveTab.StartDate < DateAndTime.Now && PortalSettings.ActiveTab.EndDate > DateAndTime.Now) || TabPermissionController.CanAdminPage() || Globals.IsLayoutMode())
{
//dynamically populate the panes with modules
if (PortalSettings.ActiveTab.Modules.Count > 0)
{
foreach (ModuleInfo objModule in PortalSettings.ActiveTab.Modules)
{
success = ProcessModule(objModule);
}
}
第二步: 安全審計(Security Audit)
第2步就是判斷在上一步中檢索出來的安全信息。通過檢查當前用戶的角色(是注冊用戶還是匿名用戶)以及與每個模塊相關聯的查看角色,就可以為當前頁面形成一列經過“授權”的模塊。
private Boolean ProcessModule(ModuleInfo module)
{
bool success = true;
if (ModulePermissionController.CanViewModule(module) && module.IsDeleted == false &&
((module.StartDate < DateTime.Now && module.EndDate > DateTime.Now) || Globals.IsLayoutMode() || Globals.IsEditMode()))
{
//...
}
//...
}
第三步:內容注入(Content Injection)
第3步(也是最后一步)就是將“授權”模塊動態地插入到頁面上相應的內容窗格中。在所有的模塊加載之后,每個模塊就能夠執行各自的事件並呈現內容。
Pane pane = GetPane(module);
if (pane != null)
{
success = InjectModule(pane, module);
}
- 頁面(Tab)
圖二描述了基本的Portal的Tab組件。頁面本身表示一個完整的標記文檔,由大量的內容窗格(Pane)組成,並且在每個內容窗格中還包含大量的模塊。
圖二:頁面組件
每個模塊都包含一個標題、若干裝飾(Container)以及由模塊生成的內容。裝飾可以包括若干按鈕、鏈接以及一個改變模塊狀態或者執行與模塊相關功能的懸浮菜單。
- 模塊(Module)
正如前面所述,Portal是基於Web的應用程序,處理各種請求並生成動態內容。每個模塊都生成自己的標記塊(稱為段),再和皮膚的標記一起展示完整的文檔。
因為每個模塊都生成自己的標記,所以可以將模塊視為較大應用程序中的微型應用程序。通常,用戶通過單擊鏈接或者提交表單(所提交的表單由門戶網站系統及傳遞給相應模塊的命令處理)與每個模塊生成的內容交互。
- 模塊容器(Container)
模塊周圍的裝飾稱為模塊容器。通過容器,用戶能夠與模塊交互,執行諸如最小化、最大化以及其他高級特性(如果用戶擁有該頁面的編輯特權)的動作。
圖三示范了一個HTML模塊在用戶以編輯特權登錄時的模塊容器。這個模塊容器包含許多項,例如擁有一列管理選項的懸浮菜單、模塊的標題。
圖三:模塊容器
DotNetNuke est le plus gros projet open-source en technologie .Net.