天天看點

DotNetNuke 5 C#版本解讀之--架構介紹

  整體上DNN5和其它比較大的企業級應用系統一樣分為web伺服器和資料庫伺服器。Web伺服器包括表現層,商業邏輯層和資料通路層,而資料庫伺服器主要是資料層。如下圖:

  

  首先給大家介紹下DNN的表現層,上圖中的Presentation部分:

  表現層主要包含如下幾個部分: web forms : 整個DNN主要的就是哪個default.aspx頁面來展示内容。它是整個系統的入口點。當某個動作發生時,它會動态的加載表現層需要顯示的内容。

  皮膚: default.aspx頁面會為不同的頁面加載它的皮膚。DNN皮膚更換非常靈活,這是它很大的一個優點。皮膚的基類是在DotNetNuke.UI.Skins這個命名空間。最基本的類是Skin.cs這個類,如下圖:

  

  後面的文章裡我将會和大家仔細來研究皮膚這部分的代碼如何來加載html皮膚檔案的。 Panes: Pane這個類是在DNN 5加進來的。一個皮膚檔案可以包含很多個pane。

  容器:每個Panel上面都會有來加載DNN子產品,頁面或者是portal的容器。容器的基類是在DotNetNuke.UI.Containers命名空間下,如下圖:

  

  子產品(Module):每個子產品至少有一個使用者控件(.ascx檔案)。這個控件會被load在容器裡面。DNN所有的子產品都在檔案夾DesktopModules/…下面。

  

  用戶端js腳本:大部分的js腳本檔案都放在js檔案夾下,dnn允許一些子產品去包含和引用js檔案。比如DNNMenu控件就用到dnnmenu.js。皮膚用的js檔案就需要放在皮膚的安裝目錄下,自定義子產品用到的js檔案放在自定義子產品的目錄下。

  下面我們來串一下DNN的表現層是如何工作的:

  當用戶端通路DNN的portal時,會看到default.aspx頁面,default.aspx頁面的背景代碼default.aspx.cs檔案會加載目前頁面的皮膚,皮膚必須是個繼承了DotNetNuke.UI.Skins.Skin這個基類的使用者自定義控件。

  首先皮膚這個對象會針對皮膚檔案中每個文本區域建立一個Pane對象,并且把它們放在一個大的容器中。皮膚對象會疊代目前portal的所有module。接下來皮膚對象會把這些module傳給适當的一個Pane來展現出來。如果一個Pane有兩個或兩個以上的module,那麼這個pane将會生成一個大的容器來存放這些module。

  接下來每個Pane将會決定該給它的module使用哪種類型的container。Pane對象為每個module初始化一個Container對象.

  上面動作完成後,Container對象就開始查找是否自己的module繼承了DotNetNuke.Entities.Modules.iActionable這個接口,如果是,Container将會找到繼承的那些動作,并順序的把它們放到contianer中。

  皮膚,容器和子產品都能有自己的css檔案。在加載它們時,它們都會在自己的目錄下查找是否有一個css檔案,有的話就加載到用戶端。

  上面的過程如果你看着不是很清晰,你可以通過下面這個圖解來了解:

  

  DNN的邏輯表現層介紹

  如文章開始的圖示,邏輯表現層主要有如下幾部分: Localization :也就是傳說中的區域化。可以選擇不同的語言。

  Caching: 通過使用緩存讓頁面在用戶端的響應速度更快。

  Exception management: 異常處理。一個好的系統異常處理也是必須。這樣可以讓使用者更加舒服。

  Event logging: 日志的記錄。。。。

  Personalization: 個性化的設定。

  Search: 搜尋

  Installation and upgrades:很好的更新和安裝模式。

  Membership,roles and profile: 角色管理等。

  Security permissions: 安全許可。

  所有的這些邏輯表現層的實作都是使用DNN中非常出色一個模式:CBO and CBO controller。(可能你對這個比較迷惑,沒關系,我會在接下來的文章中着重介紹一下。這裡你先了解大緻的架構就行了)。

  CBO本質上是對整個應用程式中某個對象的一個展示。

  在DNN中,一個CBO是一個DotNetNuke.Service的實體。目前DNN5中所有的CBO如下:

  

  上面開始介紹邏輯表現層包含的那幾部分,我們在CBO裡都可以找得到。

  CBO就好比在MVC裡德Model部分,它一般都會是一個隻有屬性的類,而對它執行操作的那個CBO control就好比MVC中的controller類。

  如果這麼了解的話CBO模式其實算是老模式了,但是這裡比較奇特的是一個CBO Hydrator的類。它的位置:

  

  仔細去看它的代碼你會發現它的作用就是把用到的對象的屬性放到緩存中,當某個對象被再次用到時,所有的屬性值直接從緩存裡得到,對伺服器來說壓力減少了。圖示:

  

  DNN的資料通路層介紹

  資料通路層就是為了能夠向商業邏輯層提供資料。DNN的資料通路層使用的是Provider Model模式。

  Data Provider是DNN中第一個成型的Provider Model模式的執行個體。當初DNN隻是支援SQL Server資料庫,但是很多人都要求它能夠支援其它的資料存儲,這樣就需要一個擴充性非常好的資料通路層,也就引入了Provider Model模式。如下圖:

  

  因為Provider Model能夠讓一些特性更加獨體,不會依賴DNN的API,是以DNN大部分的CBO的資料提供都是Provider Model來進行的。主要包括如下一些Provider:

  

  以上基本上介紹了DNN的整體架構,當然由于我的表達能力和你本身可能剛接觸DNN的緣故,你會很迷惑,甚至覺得沒啥用,不過我希望我接下來拆開每一部分來介紹DNN能夠讓你更加的了解DNN。也希望你可以去codeplex上下載下傳DNN的C#來體驗下。接下來都會是結合代碼來進行的,是以建議你去下載下傳DNN 5.4.4 C#版本。

  這裡再補充一下DNN的命名空間介紹:

  DotNetNuke.Common: 整個應用程式中任何地方都可能用到的類的集合。

  DotNetNuke.Data: 所有需要于資料庫互動的地方都會用到的類的集合。

  DotNetNuke.Entities: 所有顯示和管理Host,Portals,TabsUsers和Modules的部分都會用到的類的集合。

  DotNetNuke.FrameWork: 一些最基本的類的集合。例如Usercontrol的基類,Page的基類等

  DotNetNuke.Security: 使用者權限管理部分的類的集合。包括認證,以及頁面的通路權限管理等。

  DotNetNuke.UI:使用者接口的類的集合。例如:

  DotNetNuke.UI.Skins.skin,DotNetNuke.UI.Containers. Container等等。