天天看點

淺談ASP.NET三層結構模式

下面簡單的總結一下對三層結構的了解

1、 資料通路層是通用的。

2、 實體類也是通用的。

3、 常用的功能(比如分頁、關聯下拉清單等)都寫成了控件,自然也就是通用的了

先說一下資料通路層。

            簡單的說就是對ado.net的進一步的封裝 —— 簡化功能的封裝。ado.net是通用的,是以我的資料通路層自然也就是通用的了。

           想想我們需要的是什麼?執行sql語句(比如添加、修改、删除)、傳回記錄集(存放在DataSet等對對象裡面)。我的資料通路層也就是圍繞這兩個功能而展開

   直接使用 ado.net 的話要寫好幾行代碼才能得到一個DataSet 。需要傳入的參數:sql語句、存儲過程的名稱(存儲過程的參數)。

根據實際情況判斷具體傳入什麼參數,以及使用那些函數。(這些都是調用資料通路層的地方的事情。)

        傳回類型:傳回 void 、DataSet 、DataTable、DataRow、string[]、string,最近又增加了傳回結構數組的功能,結構數組也就是“實體類”。

簡單的說我的資料通路層就是這些接口。

下面舉例說明我的資料通路層的使用方法:

比如我想在網站的首頁裡調用最後添加的五條資訊,然後綁定到Repeater控件上。

我可以這樣寫

 JYK.DataAccessLayer dal = new JYK.DataAccessLayer();          //執行個體化資料通路層

 Rpt_News.DataSource = dal.RunSqlDataTable (“select top 5 字段 from 表名 where 條件 排序等”);        //獲得記錄集

 Rpt_News.DataBind();

 dal. Dispose() ;//釋放資源。

        短短幾行就實作了功能,除了前台Repeater 裡面需要再寫點代碼之外,其他的地方就不用再寫任何的代碼了。我感覺我的方法是相當的簡介,你的感覺呢?

(當然首頁裡面不會隻顯示資訊就完事了,其他的也是類似的寫法。也可以用

 DataSet ds = dal.RunSqlDataSet(sql語句)

 或者

 DataSet ds = dal.RunStoreDataSet(存儲過程名稱)

傳回多個記錄集。然後用 ds.Table[0]、ds.Table[1]…來綁定控件。)

資料通路層先說到這裡,下面說說實體類

        一開始我是不用實體類的,因為感覺需要一個表對應一個實體類,如果是這樣的話就太麻煩了。取代的是直接使用DataTable ,和資料通路層搭配用起來也是很簡單的。

        後來發現 <%# DataBinder.Eval(Container, "DataItem.txt")%> 的綁定方法實在是效率太低了,後棄之不用,改成了 <%#((DataRowView)Container.DataItem)["Url"]%>。但是總感覺不爽。突然想起來以前有位高人提及自定義資料源綁定控件的方法。記憶已經很是模糊了,隐約感覺是使用了結構之類的東東。經過一段時間的摸索和實驗,确定了自己的一種“實體類” —— 更準确的說就是結構(struct)數組。

//插叙

        讓我們先來看看網頁裡的“元素”。想想上面那個顯示資訊的例子,在頁面裡面(UI層)我們需要擷取什麼呢?連結網址、資訊标題、發表時間、人氣、資訊圖檔的網址、資訊的簡要介紹。(還有其它的嗎?)

        根據我的編寫網站的經驗,這些已經足夠了。也就是說結構(struct)裡面定義這些屬性就足夠一般的頁面(首頁和清單頁面)使用了。當然在實際中我又加了一個ID的屬性。

//插叙結束

        通用的實體類,也就是說不管是資訊還是檔案下載下傳還是其它的什麼,都用具有這些屬性的結構數組來儲存記錄集。再在資料通路層裡面增加一個函數來傳回結構數組(就像傳回DataTable 那樣的函數)。前台調用也是很友善,不僅可以綁定到控件,而且可以直接使用 for 循環來顯示資料(仿佛回到了asp的時代J)。因為for更加的靈活,是控件所無法比拟的!而且可以很輕松的應對美工給的不好循環的頁面。

綁定控件的寫法

 <%# ((BaseTitle)Container.DataItem).URL%>

 <%# ((BaseTitle)Container.DataItem).Title%>

 <%# ((BaseTitle)Container.DataItem).ImagePath%>

 <%# ((BaseTitle)Container.DataItem).Hits%>

……

for的寫法。(背景定義 myData,并使用我的資料通路層填充資料)

 <%= myData[i].URL%>

 <%= myData[i]..Title%>

 <%= myData[i]..ImagePath%>

 <%= myData[i]..Hits%>

相同的寫法,不用考慮具體的字段名稱,那裡使用複制到哪裡就可以了,是不是很友善。

下面總結一下:

UI層 : aspx頁面

邏輯層,分為兩種情況:

在項目裡面隻出現一次的函數,直接寫在aspx.cs頁面;

在項目裡面會多次出現的函數,寫在.cs檔案裡面。(比如登入、驗證使用者登入資訊等)

大量使用自定義控件來簡化編碼。

資料通路層:調用dll檔案,無需重複編寫代碼。

當然這麼看起來的話好像變成了一層的代碼,因為代碼都寫在了 aspx和aspx.cs裡面了。

我采用的是分層的思路,而不是分層的形式!

不知道我有沒有說明白。

我的表述能力比較差,請多多原諒。

先寫這些,具體的以後慢慢寫。