下面簡單的總結一下對三層結構的了解
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裡面了。
我采用的是分層的思路,而不是分層的形式!
不知道我有沒有說明白。
我的表述能力比較差,請多多原諒。
先寫這些,具體的以後慢慢寫。