iT邦幫忙

DAY 15
3

DotNetNuke的學習心得系列 第 11

[鐵人賽Day15]DotNetNuke模組設計範本–SimpleModule(4)

前面三篇看完了View、Edit、Settings Control之後,這篇應該是SimpleModule的最後一篇,把剩下來的DataProvider、SqlDataProvider、SimpleModuleController、SimpleModuleInfo、.SqlDataProvider、Uninstall.SqlDataProvider一次看完吧!
先來看看副檔名為.SqlDataProvider的檔案。

01.00.00.SqlDataProvider

內容有點長,所以就把說明寫在前面。
檔案名稱的數字所代表的是版本編號,這必須和.dnn檔案中的version版本編號相對應,而這些版本編號的.SqlDataProvider檔案會在DotNetNuke模組升級的時候被執行,而且DotNetNuke會累加呼叫。
也就是說,如果有01.00.00、01.01.15、01.02.02三種版本,而某個安裝模組的網站用的是01.00.00,在01.01.15版本推出的時候並沒有馬上升級,等到要升級的時候最新版本已經是01.02.02,因此當最新版本的模組安裝的時候,會先執行01.01.15.SqlDataProvider更新資料庫的內容之後,再執行01.02.02.SqlDataProvider的內容來更新資料庫;換句話說,模組在開發的時候,每個版本的.SqlDataProvider都必須是前一版的差異變更內容。

在01.00.00.SqlDataProvider不外乎就是建立資料表(Table)、檢視表(View)和預存程序(Stored Procedure)這類的事情,只是如果打算要複製這個檔案的內容送到資料庫去執行,千萬別忘了把大括號{}的內容更改過,也就是{databaseOwner}、{objectQualifier},這兩個是在DotNetNuke要執行.SqlDataProvider的時候會取代掉的字串,也就是DotNetNuke當初在安裝的時候設定的DatabaseOwner和ObjectQualifier。(忘了安裝時在哪有設定過DatabaseOwner和ObjectQualifier請參考這篇;別忘了取代YourCompany)

這邊特別要提的部份,是如果打算在Windows Azure上使用SQL Database來當作DotNetNuke的資料庫,那麼要特別注意雲端上不支援的語法,像是Not Fro Replication和Column alias的部份(圖中有說明)。


(點圖可放大)

Uninstall.SqlDataProvider

解除安裝模組的時候也需要將環境復原,因此會有一個Uninstall.SqlDataProvider,並且不分版本號,也沒有累加執行,所以在每一個版本的模組安裝檔中,都應該要包含Uninstall.SqlDataProvider,並且在每一個版本有異動資料庫內容的時候就要來改相對應解除安裝時應該要做的事。

解除安裝時執行的資料庫語法應該不需要多介紹,這也要視模組的設計內容而定,不過差不多就是Drop Constraint、Index、Table、Stored Procedure這類的,反正就是還給使用者一個乾淨的環境就是了。(但是別刪到DotNetNuke本身的資料唷!)


(點圖可放大)

接下來看DataProvider:

在DataProvider中除了宣告抽象化的資料存取方式以待子類別實作之外,最重要的就是透過Reflection的方式讀取web.config中的設定(DotNetNuke自定義設定組態放置在web.config中),動態決定要建立的是哪一個實作DataProvider的組件,並且將實例化的物件放在私有靜態變數中,以供另一個公開的靜態方法Instance來存取,而實作DataProvider的類別在這個模組的範例中就是SqlDataProvider。

知道了DataProvider的定義,就來看看SqlDataProvider的實作吧!

在SqlDataProvider的程式碼有點長,所以先從region區塊來看,分為Prviate Members私有變數、Constructors建構式、Properties屬性、Private Methods私有方法、Public Methods公開方法。

Private Members Region

除了一些變數的宣告之外,這邊比較特別要看的是ProviderConfiguration類別,它會負責讀取DotNetNuke在web.config中的設定區段群組(section group),找到data區段(section)。
web.config的設定如下圖:

Constructors Region

objProvider會透過ProviderConfiguration從web.config中取得預設的Provider設定值,並且將相關的屬性值取出來,包括ConnectionString等…。

Properties Region

這些都是宣告為唯讀的屬性值,傳回私有變數的內容,而內容就是從web.config中讀出來的。

Private Methods Region

Public Methods Region

在公開方法中,其實就是利用Microsoft.ApplicationBlocks.Data中的SqlHelper類別,傳入連線字串和預存程序的完整名稱和相關參數來執行SQL的命令,如果有需要回傳資料的就透過IDataReader型態回傳資料以供讀取。程式碼看起來應該也沒有很複雜,相當簡潔。

兩個DataProvider都看完了,接下來就要來看看Controller如何使用它,不過在看Controller之前,必須先看一下SimpleModuleInfo這個承載資料的類別:

非常簡單,就是定義一些屬性用來裝載資料用的。
(礙於截圖限制,Visual Studio不方便捲動截圖,因此將Public Properties都收合,每一個屬性內容都是單純的Get、Set存取上方所定義的私有變數)

最後來看SimpleModuleController怎麼實作:

在Public Methods中有五個方法,都是使用DataProvider中所定義的抽象方法再將資料組合一下放置到SimpleModuleInfo中。
另外Controller有實作兩個介面,分別是ISearchable、IPortable,這是選擇性實作的介面,是告訴DotNetNuke這個模組支援搜尋和匯出匯入的功能,因為是選擇性實作,所以這邊就不詳細的看了,留給有興趣的讀者自行研究囉!

Public Methods Region

這邊可以看到,除了使用DataProvider的靜態方法Instance來取得實作的Provider(這邊是SqlDataProvider)以存取DataProvider中定義的抽象方法外,需要特別看的就只有DotNetNuke提供的工具類別CBO,它可以用來從IDataReader中讀取資料,並且將資料塞入到所提供的泛型類別中或是傳入的type型態,這樣就可以不需要開發者自行從DataReader中讀取資料再根據屬性來塞入相對應的屬性值了。

最後剩下來的就是.dnn檔案了,resx資源檔沒什麼特別需要看的內容,讀者可自行參考,.dnn檔案雖然在之前的文章已經有提過,但是這邊要特別再看一下的原因是在這個範本專案所提供的.dnn版本格式和先前文章所提到的.dnn檔案的版本格式不同,但是兩者都可以使用,先前文章所提到的版本格式是5.0,範本專案提供的是較舊的3.0版本,內容如下,請讀者自行參考囉!

<dotnetnuke version="3.0" type="Module">
  <folders>
    <folder>
      <name>DotNetNukeSample.SimpleModule</name>
      <friendlyname>SimpleModule</friendlyname>
      <foldername>DotNetNukeSample.SimpleModule</foldername>
      <modulename>DotNetNukeSample.SimpleModule</modulename>
      <description>A SimpleModule module</description>
      <version>01.00.00</version>
      <businesscontrollerclass>DotNetNukeSample.Modules.SimpleModule.SimpleModuleController</businesscontrollerclass>
      <modules>
        <module>
          <friendlyname>SimpleModule</friendlyname>
          <cachetime>0</cachetime>
          <controls>
            <control>
              <src>DesktopModules/DotNetNukeSample.SimpleModule/ViewSimpleModule.ascx</src>
              <type>View</type>
              <helpurl></helpurl>
            </control>
            <control>
              <key>Edit</key>
              <title>Edit Content</title>
              <src>DesktopModules/DotNetNukeSample.SimpleModule/EditSimpleModule.ascx</src>
              <type>Edit</type>
              <helpurl></helpurl>
            </control>
            <control>
              <key>Settings</key>
              <title>SimpleModule Settings</title>
              <src>DesktopModules/DotNetNukeSample.SimpleModule/Settings.ascx</src>
              <type>Edit</type>
              <helpurl></helpurl>
            </control>
          </controls>
        </module>
      </modules>
      <files>
        <file>
	        <name>DotNetNukeSample.Modules.SimpleModule.dll</name>
	      </file>
        <file>
          <name>ViewSimpleModule.ascx</name>
        </file>
        <file>
          <name>EditSimpleModule.ascx</name>
        </file>
        <file>
          <name>Settings.ascx</name>
        </file>
        <file>
          <path>App_LocalResources</path>
          <name>ViewSimpleModule.ascx.resx</name>
        </file>
        <file>
          <path>App_LocalResources</path>
          <name>EditSimpleModule.ascx.resx</name>
        </file>
        <file>
          <path>App_LocalResources</path>
          <name>Settings.ascx.resx</name>
        </file>
        <file>
          <name>01.00.00.SqlDataProvider</name>
        </file>
        <file>
          <name>Uninstall.SqlDataProvider</name>
        </file>
      </files>
    </folder>
  </folders>
</dotnetnuke>

(本文同步發表於泰克哪裡去部落格)

[鐵人賽Day1]DotNetNuke簡介
[鐵人賽Day2]DotNetNuke安裝前置作業
[鐵人賽Day3]DotNetNuke安裝-傳統方式安裝在IIS
[鐵人賽Day4]DotNetNuke安裝-透過Web PI安裝
[鐵人賽Day5]DotNetNuke安裝-使用Windows Azure Website
[鐵人賽Day6]DotNetNuke網站結構說明
[鐵人賽Day7]安裝DotNetNuke語系
[鐵人賽Day8]DotNetNuke-新增頁面與模組
[鐵人賽Day9]第一個DotNetNuke模組-Hello DotNetNuke
[鐵人賽Day10]DotNetNuke模組的多國語系
[鐵人賽Day11]安裝DotNetNuke專案範本
[鐵人賽Day12]DotNetNuke模組設計範本–SimpleModule(1)
[鐵人賽Day13]DotNetNuke模組設計範本–SimpleModule(2)
[鐵人賽Day14]DotNetNuke模組設計範本–SimpleModule(3)
[鐵人賽Day16]DotNetNuke使用篇–會員帳號設定(User Account Settings)
[鐵人賽Day17]DotNetNuke使用篇–第三方帳號驗證
[鐵人賽Day18]DotNetNuke使用篇–管理使用者帳號、角色
[鐵人賽Day19]DotNetNuke使用篇–建立子網站
[鐵人賽Day20]DotNetNuke使用篇–內容多語系化
[鐵人賽Day21]DotNetNuke使用篇–Host設定介紹
[鐵人賽Day22]DotNetNuke使用篇–網站設定(Site Settings)介紹
[鐵人賽Day23]翻譯DotNetNuke–使用語言編輯器
[鐵人賽Day24]DotNetNuke的網頁選單(Menu)翻譯
[鐵人賽Day25]設定DotNetNuke的Email範本
[鐵人賽Day26]DotNetNuke寄送郵件功能介紹
[鐵人賽Day27]查看DotNetNuke的執行記錄–事件檢視器(Log Viewer)介紹
[鐵人賽Day28]維護DotNetNuke的清單列表(List)–在Profile中可以下拉選擇台灣的縣市
[鐵人賽Day29]DotNetNuke樣式設計–Skin和Container簡介
[鐵人賽Day30]尋找更多的DotNetNuke擴充套件(Module、Skin)


上一篇
[鐵人賽Day14]DotNetNuke模組設計範本–SimpleModule(3)
下一篇
[鐵人賽Day16]DotNetNuke使用篇–會員帳號設定(User Account Settings)
系列文
DotNetNuke的學習心得27

2 則留言

0
kenny2061
iT邦新手 3 級 ‧ 2013-10-07 23:57:34

今天的內容有點多,真是驚險…剩3分半鐘我就Game over了!汗

0
kenny2061
iT邦新手 3 級 ‧ 2013-10-08 00:15:45

這篇有兩張圖比較長,特別是第一張,所以另外加上了原始大小的圖片連結,希望大家不會看到眼突…
在Blog上每一張都直接會有原始大小的圖片連結,若真的覺得太小的話,歡迎大家到Blog逛逛!

泰克哪裡去

我要留言

立即登入留言