我是最近才開始學習dnn的,接到的第一個任務就是開發dnn的模組。最近有朋友問我開發的步驟,我想還是把它寫在blog上,一方面為了共用資源,一方面是希望能夠得到dnn開發高手的指點。
在模組的開發上,我採用的方案:
介面層和代碼層完全分開。
至於採用這個方案,對我來說並不是偶然的,因為我之前從來沒有做過asp或是asp.net的開發,所以我對asp.net的介面展示層不感興趣。所以我將模組的執行代碼放到了另外一個工程中。不過這一點還是要得益於asp.net的架構,如果是在asp下面,這種開發模式是不可能的。
由於我的文字功底很差勁,所以,有表達不清楚的地方,大家可以用qq,msn或是email交流。
首先,開啟工程模板,建立建一個dnn網站(圖1),說明一下,由於我示範的是一個已經建好的dnn網站,所以多了一個DesktopModules檔案夾,在最開始建立網站的時候,這個檔案夾是不存在的,這個檔案夾就是用來存放DNN Module的檔案夾。
圖1
然後,通過工程嚮導,添加Dnn模組,在這裡,我選擇的是C#,因為我個人比較喜歡用C#。在這裡我建立一個Request模組圖2
圖2
當模組添加之後,你要將模組所在的檔案夾名稱改為模組名稱,即將ModuleName改為Request。圖3
圖3
在這裡一個模組的添加就算完成了,但是如果要將模組的執行代碼放到另外一個工程中,我們還要做一些工作。
在這裡,我另外建立一個class library工程,叫做HGG.Request。我這樣命名只是為了專案管理,在技術上沒有其它什麼意思。圖4,圖5,由於顯示的原因,我把圖片分成了兩截。
圖4
圖5
大家可以發現,每個頁面對應的cs檔案被移到了HGG.Request工程中,除此之外,還有資料處理檔案也被移動到了這個裡面。
那麼這兩個工程是如何關聯起來的呢,以EditRequest.aspx檔案為例,在最初由工程嚮導產生這個檔案的時候,代碼是這樣的:
<%@ Control language="C#" Inherits="YourCompany.Modules.Request.EditRequest" CodeFile="EditRequest.ascx.cs" AutoEventWireup="true"%>
而當我把執行代碼放到HGG.Request工程中後,我必須對上面的這段代碼做如下調整:
<%@ Control Language="C#" Inherits="HGG.Modules.Request.EditRequest" AutoEventWireup="false"
Explicit="True" %>
最關鍵的變化是刪除了CodeFile設定,修改了Inherits設定。簡單的說,HGG.Modules.Request.EditRequest就是在HGG.Request工程中,處理EditRequest.aspx的類,這個類名稱叫EditRequest,名稱空間為HGG.Modules.Request。
做完了上面的這一步,我們基本上就完成了表現層和代碼層的分離工作。下面的問題是這兩層如何通訊。
關於這一點,asp.net做得非常的強,.net架構上有動態事件綁定,這樣的技術在asp.net中同樣有效。
例如,在Request.aspx上有一個button:
<div style="float: left;">
<asp:LinkButton ID="PreviousLink" runat="server" Text="Previous" CssClass="Normal" />
</div>
如果我們要處理它被點擊後的事件,那麼在HGG.Request工程中的Request.cs檔案中,我們要做以下事情
1、在頁面載入時,定義事件綁定:
//聲明事件綁定
private void RegisterEvents()
{
SearchButton.Click += new EventHandler(SearchButton_Click);
PreviousLink.Click += new EventHandler(PreviousLink_Click);
NextLink.Click += new EventHandler(NextLink_Click);
this.Load += new EventHandler(EditRequest_Load);
}
//定義事件的處理代碼
private void PreviousLink_Click(object sender, EventArgs e)
{
MovePage(SegmentData, false);
}
在這裡,PreviousLink在這個類中,是一個屬性,我通過這個屬性來擷取Request.aspx上PreviousLink的引用,在這裡,HGG.Request中的Request類就和Dnn網站上的Request.aspx聯絡起來了。那麼這個屬性是如何定義的呢?下面是它的代碼:
private LinkButton PreviousLink
{
get
{
return (LinkButton)FindControl("PreviousLink");
}
}
這就是關鍵。
其它的我想我這裡就不必多說了,幾乎一般的windows類庫開發模式一樣。
好了,這篇文章在這裡就結束了,希望我說清楚了,不清楚的地方,歡迎討論。
(最近我也在學習做dnn的皮膚)