XCode之第一次親密接觸
首先得說明,本教程僅用於讓第一次接觸XCode的朋友了解XCode,不具有任何別的實際意義,真正的項目也不會采取這種開發方式,而采用更先進、快速而強大的開發方式。
NewLife.XCode是一個數據映射框架,包括但大於ORM的范圍。XCode意為未知的代碼的意思,是整個X系列組件很重要的一員。實際項目開發,會根據項目類型不同,應用場合不同,由多個不同的組件配合發力,這就導致了幾乎無法發現XCode在其中的用處,而XCode的學習,也就無從做起。按某朋友的說法:“想看看這個頁面怎么工作,結果頁面后面一行代碼也沒有,深入一點發現全是接口!”
所以,本教程從最最最通俗的做法談起,先使用純XCode實現,然后一步步的引入其它組件,讓大伙明明白白最終項目是如何工作的!
這次我們做一個最簡單的CMS,只有管理員、欄目、文章三張表,字段也是最精簡的。后面會針對這個例子,一步步展開,介紹XCode的各個主要功能。
關於XCode的層次介紹參看《ORM組件XCode(簡介)》
作為入門的更有深度的姐妹篇《ORM組件XCode(動手)》
一、數據庫
最原始的做法,我們先到MSSQL里面建立好數據表,我這里是MSSQL2008,你用別的版本或者別的數據庫也沒有關系。
管理員表,只要用戶名和密碼,我們弄一個自增ID的字段作為主鍵。用別的比如GUID作為主鍵也行,最好有一個單一主鍵,那樣會方便一些,后面會講到。
欄目表,我們先不考慮多級,只要一級,那樣子只需要一個名稱字段就足夠了。注意設置ID字段為主鍵和標識。
文章表,需要跟欄目表建立管理關系,然后有標題和內容。注意設置ID字段為主鍵和標識。
這樣子就建好了最簡單的三張表。
二、生成實體類
很多ORM都有配套的代碼生成器,下面我們請出我們的代碼生成器XCoder,注意,這里是XCoder,意為未知編碼者,而前面是XCode。這個剛解壓后的樣子,一個主程序,三個類庫,一個配置文件。
啟動主程序。這里也許它會自動升級,不用擔心,升級會自動完成。
很土的界面,不過沒關系啦,這個XCoder就是一個很簡單的空殼子(開放源碼),真正的使用者會用自己的修改版,或者使用更先進的魔方開發平台。
我們看看“連接”右邊的下來菜單,看看都有哪些連接:
這是配置文件里面內置的一些連接,每一種數據庫的都有,其實是連接字符串的樣板,省得用到時找不到。XCoder在這里有自動探測功能,能夠探測本機的MSSQL,本目錄的Access和SQLite。
可以看到mssql_CMS那個就是我們剛才建立的庫,為了加深理解,我們手工去配置一下。
關閉XCoder,打開配置文件“XCoder.exe.config”:
這里是最常用的一些設置,我們重點看連接字符串部分,增加一個名為CMS的連接:
這個name就是在連接名,將會在前面代碼生成器界面的“連接”下拉里面列出。重新打開代碼生成器看看:
我們剛添加的CMS在第一位,后面也多了好些,我們不用去管它。
點擊“連接”按鈕吧,下面的數據表選擇就激活了:
這里可以見到我們剛才添加的三張表。右邊的兩個生成按鈕也亮了,也就是說可以生成了。不過先別着急,我們看看下面的各個設置框,重點是右邊的模版:
先看右邊的模版,有六個帶星號開頭的模版,星號表示內置模版,如果感興趣,可以點右邊的“釋放內置模版”按鈕,把它們釋放出來到文件中,學習一下怎么寫模版也行,這里就不多說了。
這次我們主要是想生成實體類代碼,要用到實體數據和實體業務兩個模版,因為一個實體類由兩個文件采用分部類的方式組成,如果修改了數據庫表結構,下次只需要生成實體數據那個文件即可,而開發者自己寫的代碼都寫在實體業務那個文件里面。
我們修改一下左邊的設置:
命名空間就是要生成的實體類的命名空間,連接名也是實體類里面的一個模版變量,輸出目錄自然就是實體類文件要存放的目錄啦,相對於代碼生成器根目錄。
一切准備就緒,選擇實體數據模版,點擊“生成所有表”按鈕,然后換成實體業務模版,再生成所有一次。
下面我們去看看MyCMS目錄,我們生成的東西在那:
都在這!每個表兩個文件,帶Biz的是業務文件,供手寫代碼的,另一個就是數據文件,方便數據表結構變更時重新生成覆蓋。
先看看實體數據文件:
上面這個命名空間,就是剛才代碼生成器那里填寫的;下面這個ConnName就是代碼生成器那里填寫的連接名。
再看看實體業務文件:
命名空間和類型,跟數據實體是一樣的,注意那個partial關鍵字,表示分部類的意思,一個類分成兩個文件存放。絕大部分ORM的實體類都這么干。
這個類繼承自Entity<Admin>,其中Entity<>是泛型基類,也就是XCode實體層的核心,實體類的絕大部分功能都由它提供。這個對應於代碼生成器上的“實體基類”,有些時候可能需要使用自己的實體基類。
下面有很多代碼段,里面幾乎都是一些注釋,告訴用戶最常用的一些功能怎么用怎么寫。
三、建立站點
實體類都生成好了,我們開始建立項目吧。一個CMS解決方案,包括一個CMS類庫和一個Web站點(Website)。
把那個Class1.cs刪了,把上面生成的實體類文件放進去,設置站點Web引用類庫CMS。
開始編譯一下看看。
真是壯觀呀!原來是我們忘記引用XCode了。把我們准備好的DLL放進來,跟Web和CMS目錄並排。(XCode.dll依賴於核心庫NewLife.Core.dll)
類庫CMS引用這兩個DLL,網站就不需要引用了,因為網站引用了類庫,XCode那些會跟着過來的。再編譯!
這回編譯通過了!
給web.config設置一些常用設置,當然最重要的就是數據庫連接字符串;
打開全局調試開關和XCode調試開關,主要是為了看到完整的XCode工作日志。
我們先在默認頁Default.aspx寫一段測試代碼看看,同時也是給系統增加一個管理員帳號:
這段代碼很簡單,調用實體類的靜態方法Find去查找UserName為admin的對象,如果沒找到,就實例化一個,然后分別給兩個屬性賦值,再保存Save回去,這樣子就往數據庫插入了一條記錄。
不要忘了引用實體類的命名空間“NewLife.CMS”,這樣才能使用實體類Admin。
這算是第一段使用XCode的代碼,趕緊的預覽頁面看看效果:
執行成功!到這里,一個只有實體類的空白站點就建立了。
四、后台登錄
建立一個后台目錄Admin,包括后台首頁Default.aspx和登錄頁Login.aspx。
設計登錄頁,登錄成功后跳轉到后台首頁。后台首頁如果發現沒有登錄就跳轉到登錄頁。
這里也不要忘了引用實體類命名空間“NewLife.CMS”。預覽頁面看看效果!
關於XCode里面添刪改查等完整代碼操作參看《ORM組件XCode(速覽)》
五、建立后台
我們在后台目錄Admin中增加一個用來管理管理員的頁面Admin.aspx,然后調整一下后台首頁Default.aspx,讓它作為后台導航頁,通過菜單鏈接到其它管理頁面Admin.aspx和AdminForm.aspx。
下面開始設計Admin.aspx,這個作為一個列表頁,把該表所有數據列出來。我們采用經典的GridView+ObjectDataSource來實現。
如果你是第一次使用ObjectDataSource,這里可要看好了。ObjectDataSource的右邊有個智能標記,一個小箭頭,可以點開。我們選擇“配置數據源”,看看神奇的一幕。
ObjectDataSource的設計界面列出來我們的所有實體類,Select那里列出來一個Search方法(XCode的Entity<>基類內置),還有Update、Insert和Delete也有(也是內置)。我們先默認,一路下去。(在這里,各個DLL的版本一定要對應,重點是XCode.dll和NewLife.Core.dll,否則ObjectDataSource將可能無法列出實體類)
選擇GridView,打開智能標記,選擇數據源為下面這個ObjectDataSource。
預覽看看效果:
出來了!沒有寫一行代碼,數據就列出來了。
我們修改一下根目錄的Default.aspx,往數據庫里面添加50個管理員數據。
(Admin.Meta.Count是返回Admin實體對應的數據表的總記錄數)
現在再來看看前面的管理員列表
全都列出來了,但是沒有分頁呀。
現在開始設置一下ObjectDataSource
EnablePaging設為true,表示支持分頁,SelectCountMethod設為SearchCount,這個也是實體基類內置方法,它跟前面的Search方法是一對,具有完全相同的參數列表,startRowIndex和maximumRows就是其中的兩個。SortParameterName設為orderClause,表示排序的那一個參數,也是Search的參數之一。
再來設置一下GridView,點開智能標記,選擇分頁、排序、編輯、刪除
把屬性DataKeyNames設置為ID,也就是實體類的主鍵。趕緊看看效果!
分頁有了,每一行多了編輯和刪除,列頭也變成藍色可選。
下面試試基本操作,同時附上日志文件(網站根目錄下的Log目錄)中的SQL語句。先看分頁
准確跳到第三頁!后面有第一頁和第三頁的查詢語句,XCode能夠根據當前使用的數據庫和版本自動生成性能最優的分頁語句。
再試試編輯ID=30的數據,並更新回去
刪除ID=31這一行
點擊列頭的UserName,讓數據按鈕UserName排序,跳到第三頁
再點擊一次,讓其反向排序,然后跳到第三頁
我們來做個查詢,增加一個文本框和查詢按鈕,查詢按鈕不需要寫代碼,僅僅是為了讓頁面回發。
然后改一下ObjectDataSource的參數,可以通過打開智能標記,一路到最后一步,也可以從屬性窗口的SelectParameters打開,設置key參數綁定控件txtKey,也就是上面的文本框。
“確定”后保存頁面,有時候設計器的修改無法更新到頁面源碼上面,可以通過把設計器切換為源碼試試,也可以點擊源碼右邊的滾動條。
圖中可以看出源碼的改變。上圖中可以看出Search方法和SearchCount有四個參數,除了key外,另外三個前面都有提到。這個方法實際上就是對這個實體類的所有字符串字段進行模糊查詢。
預覽看一下效果,輸入關鍵字“修改”進行查詢,看看能不能找到我們剛才修改的那一行。
試試查詢“admin3”
日志里面的SQL與時俱進!
上面展示了分頁、排序、編輯、刪除、查詢,實際上還可以查詢加分頁加排序,混合進行。
ObjectDataSource高級查詢可以參考《在XCode中如何使用高級查詢》
ObjectDataSource的更多精彩《與ObjectDataSource共舞》
我們增加一個添加管理員用的表單頁面AdminForm.aspx
試試添加一個管理員test/test
添加成功!
六、總結
到此為止,我們完成了一個最簡單的后台管理模塊,欄目和文章的管理,也可采用類似的做法來實現。
看到這里,如果沒看明白,建議結合例子代碼回頭再看幾次。
如果你要鄙視這種做法,那么恭喜你,終於邁開了通向XCode的第一步!
我們開頭就說過,真正用XCode開發項目,肯定不會是這么做的,因為這種做法,實在是——效率太低、可維護性太差!
如果你開始對XCode感興趣,可以先看看這幾篇文章:
充血模型的ORM能做什么?——ORM組件XCode(十八般武藝)
更多精彩敬請等待!
大石頭
新生命開發團隊
2012-02-27 00:17