学习之模块架构 DotNetNuke 6
前面的博客介紹了:
如何在本地安裝DNN6
如何創(chuàng)建DNN模塊
?
博客園原文地址 : ?學(xué)習(xí)之模塊架構(gòu) DotNetNuke 6
?
這篇博客主要是講模塊的架構(gòu)和加載,以及模塊與DotNetNuke門戶網(wǎng)站(Portals)系統(tǒng)的關(guān)系。充分了解模塊可以幫助DNN開(kāi)發(fā)者根據(jù)需要更清晰的構(gòu)建模塊。
在DNN中,模塊是一個(gè)可插入的用戶接口組件,用來(lái)處理請(qǐng)求并生成動(dòng)態(tài)的內(nèi)容。它只能出現(xiàn)在ASP.NET頁(yè)面上,而頁(yè)面可以包括任意數(shù)量的模塊"實(shí)例"。
整個(gè)模塊架構(gòu)包括四個(gè)部分 : 門戶網(wǎng)站(Portal),頁(yè)面(Tab),模塊(Module)和模塊容器(Container)。
?
- 門戶網(wǎng)站(Portal)
Portal可以定義為一個(gè)基于Web的應(yīng)用程序,從不同的源聚集內(nèi)容,并寄宿信息系統(tǒng)的表示層(模塊)。下圖描述了Portal的基本架構(gòu),DNN處理頁(yè)面請(qǐng)求時(shí)需要執(zhí)行許多步驟。下述步驟在頁(yè)面初始化的過(guò)程中執(zhí)行,用來(lái)在運(yùn)行時(shí)動(dòng)態(tài)地加載模塊。動(dòng)態(tài)創(chuàng)建的模塊然后就能夠處理它們自己的生存周期,包括諸如初始化、加載、呈現(xiàn)等各種事件。
?
圖一 : Portal的基本架構(gòu)
?
第一步: 頁(yè)面配置檢索(Page Configuration Retrieval)
第1步就是為被請(qǐng)求的頁(yè)面檢索模塊。檢索步驟由許多重要的信息塊構(gòu)成,例如頁(yè)面上出現(xiàn)的各個(gè)模塊、模塊在頁(yè)面上顯示的區(qū)域(即內(nèi)容窗格Pane),以及與每個(gè)模塊相關(guān)聯(lián)的安全角色。
//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);
}
}
?
第二步: 安全審計(jì)(Security Audit)
第2步就是判斷在上一步中檢索出來(lái)的安全信息。通過(guò)檢查當(dāng)前用戶的角色(是注冊(cè)用戶還是匿名用戶)以及與每個(gè)模塊相關(guān)聯(lián)的查看角色,就可以為當(dāng)前頁(yè)面形成一列經(jīng)過(guò)“授權(quán)”的模塊。
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()))
{
//...
}
//...
}
?
第三步:內(nèi)容注入(Content Injection)
第3步(也是最后一步)就是將“授權(quán)”模塊動(dòng)態(tài)地插入到頁(yè)面上相應(yīng)的內(nèi)容窗格中。在所有的模塊加載之后,每個(gè)模塊就能夠執(zhí)行各自的事件并呈現(xiàn)內(nèi)容。
Pane pane = GetPane(module);if (pane != null)
{
success = InjectModule(pane, module);
}
?
- 頁(yè)面(Tab)
圖二描述了基本的Portal的Tab組件。頁(yè)面本身表示一個(gè)完整的標(biāo)記文檔,由大量的內(nèi)容窗格(Pane)組成,并且在每個(gè)內(nèi)容窗格中還包含大量的模塊。
?
圖二:頁(yè)面組件
?
每個(gè)模塊都包含一個(gè)標(biāo)題、若干裝飾(Container)以及由模塊生成的內(nèi)容。裝飾可以包括若干按鈕、鏈接以及一個(gè)改變模塊狀態(tài)或者執(zhí)行與模塊相關(guān)功能的懸浮菜單。
?
- 模塊(Module)
正如前面所述,Portal是基于Web的應(yīng)用程序,處理各種請(qǐng)求并生成動(dòng)態(tài)內(nèi)容。每個(gè)模塊都生成自己的標(biāo)記塊(稱為段),再和皮膚的標(biāo)記一起展示完整的文檔。
因?yàn)槊總€(gè)模塊都生成自己的標(biāo)記,所以可以將模塊視為較大應(yīng)用程序中的微型應(yīng)用程序。通常,用戶通過(guò)單擊鏈接或者提交表單(所提交的表單由門戶網(wǎng)站系統(tǒng)及傳遞給相應(yīng)模塊的命令處理)與每個(gè)模塊生成的內(nèi)容交互。
?
- 模塊容器(Container)
模塊周圍的裝飾稱為模塊容器。通過(guò)容器,用戶能夠與模塊交互,執(zhí)行諸如最小化、最大化以及其他高級(jí)特性(如果用戶擁有該頁(yè)面的編輯特權(quán))的動(dòng)作。
圖三示范了一個(gè)HTML模塊在用戶以編輯特權(quán)登錄時(shí)的模塊容器。這個(gè)模塊容器包含許多項(xiàng),例如擁有一列管理選項(xiàng)的懸浮菜單、模塊的標(biāo)題。
?
圖三:模塊容器
DotNetNuke est?le plus gros?projet open-source?en technologie .Net.
?
轉(zhuǎn)載于:https://www.cnblogs.com/yhuang/archive/2012/03/28/modular_architecture_dnn6.html
總結(jié)
以上是生活随笔為你收集整理的学习之模块架构 DotNetNuke 6的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 微软面试题:正则表达式提取链接地址
- 下一篇: ubuntu-11.10-server-