C#三層架構(gòu) 簡單實例分析_第1頁
C#三層架構(gòu) 簡單實例分析_第2頁
C#三層架構(gòu) 簡單實例分析_第3頁
C#三層架構(gòu) 簡單實例分析_第4頁
C#三層架構(gòu) 簡單實例分析_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、.基于3層架構(gòu)的課程管理系統(tǒng)本模塊工作任務(wù) 任務(wù)3-1:三層架構(gòu)劃分 任務(wù)3-2:數(shù)據(jù)訪問層的實現(xiàn) 任務(wù)3-3:業(yè)務(wù)邏輯層的實現(xiàn) 任務(wù)3-4:表示層的實現(xiàn)本模塊學(xué)習(xí)目標 1、掌握三層架構(gòu)的劃分原理 2、掌握各層的設(shè)計思路,和層之間的調(diào)用關(guān)系 3、利用三層架構(gòu)實現(xiàn)對課程管理模塊的重構(gòu) 4、鞏固OOP的基本概念和 OOP的編程思路-任務(wù)3-1:三層架構(gòu)劃分 效果與描述數(shù)據(jù)訪問層業(yè)務(wù)邏輯層界面層圖3.1 包含多個項目的3層架構(gòu)解決方案本任務(wù)要求學(xué)生能夠?qū)⒃瓉淼闹挥?個項目的課程管理模塊,重構(gòu)為標準的具有5個項目的3層架構(gòu)的模塊,并進行恰當(dāng)?shù)某跏蓟?,仍能實現(xiàn)課程記錄的添加、瀏覽功能。在此過程中理解3層

2、架構(gòu)的劃分原理,各層的任務(wù),層之間的調(diào)用關(guān)系。本任務(wù)的業(yè)務(wù)流程:圖3.2 單層轉(zhuǎn)化為3層架構(gòu)的業(yè)務(wù)流程 相關(guān)知識與技能3-1-1 三層架構(gòu)的劃分原理三層架構(gòu)的劃分如下圖:圖3.3 三層架構(gòu)原理圖1、 各層的任務(wù)數(shù)據(jù)訪問層:使用ADO.NET中的數(shù)據(jù)操作類,為數(shù)據(jù)庫中的每個表,設(shè)計1個數(shù)據(jù)訪問類。類中實現(xiàn):記錄的插入、刪除、單條記錄的查詢、記錄集的查詢、單條記錄的有無判斷等基本的數(shù)據(jù)操作方法。對于一般的管理信息軟件,此層的設(shè)計是類似的,包含的方法也基本相同。此層的任務(wù)是:封裝每個數(shù)據(jù)表的基本記錄操作,為實現(xiàn)業(yè)務(wù)邏輯提供數(shù)據(jù)庫訪問基礎(chǔ)。業(yè)務(wù)邏輯層:為用戶的每個功能模塊,設(shè)計1個業(yè)務(wù)邏輯類,此時,需

3、要利用相關(guān)的數(shù)據(jù)訪問層類中,記錄操作方法的特定集合,來實現(xiàn)每個邏輯功能。界面層:根據(jù)用戶的具體需求,為每個功能模塊,部署輸入控件、操作控件和輸出控件,并調(diào)用業(yè)務(wù)邏輯層中類的方法實現(xiàn)功能。2、 層之間的調(diào)用關(guān)系數(shù)據(jù)訪問層的類,直接訪問數(shù)據(jù)庫,實現(xiàn)基本記錄操作。業(yè)務(wù)邏輯層的類,調(diào)用相關(guān)的數(shù)據(jù)訪問類,實現(xiàn)用戶所需功能。界面層:部署控件后,調(diào)用業(yè)務(wù)邏輯層的類,實現(xiàn)功能。將應(yīng)用程序的功能分層后,對于固定的DBMS,數(shù)據(jù)訪問層基本可以不變,一旦用戶的需求改變,首先修改業(yè)務(wù)邏輯層,界面層稍做改動即可。這種做法使程序的可復(fù)用性、可修改性,都得到了很好的改善,大大提高了軟件工程的效率。3-1-2 ORM(對象關(guān)

4、系映射)在圖3.1中看到,除了界面層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層之外,還有2個項目。其中,Common項目中一般放的是公用文件,如數(shù)據(jù)操作類DBHelper等,被數(shù)據(jù)訪問層的類調(diào)用,其必要性在上個模塊已述。Modal項目中存放的是實體類。所謂的對象關(guān)系映射Object Relational Mapping,簡稱ORM,是為了解決面向?qū)ο蟮念?,與關(guān)系數(shù)據(jù)庫的表之間,存在的不匹配的現(xiàn)象,通過使用描述對象和關(guān)系之間映射的元數(shù)據(jù),在程序中的類對象,與關(guān)系數(shù)據(jù)庫的表之間建立持久的關(guān)系,用于在程序中描述數(shù)據(jù)庫表。本質(zhì)上就是將數(shù)據(jù)從一種形式轉(zhuǎn)換到另外一種形式。ORM是一個廣義的概念,適應(yīng)于關(guān)系數(shù)據(jù)庫與應(yīng)用程序之

5、間的各類數(shù)據(jù)轉(zhuǎn)換,目前有許多自動轉(zhuǎn)換工具可用,如codesmith 等。在本教材中,利用手工書寫代碼的形式,實現(xiàn)ORM。如對于學(xué)生選課管理系統(tǒng)數(shù)據(jù)庫中的課程表course,其設(shè)計視圖如下:圖3.4 Course表設(shè)計視圖可以這樣設(shè)計類來描述它:public class Course private string courseId; public string CourseId get return courseId; set courseId = value; private string courseName; public string CourseName get return cour

6、seName; set courseName = value; private int courseCredit; public int CourseCredit get return courseCredit; set courseCredit = value; public Course() public Course(string courseId,string courseName,int courseCredit) this.courseId = courseId; this.courseName = courseName; this.courseCredit = courseCre

7、dit; 將表中的每個字段抽取為類的字段(注意類型匹配),并封裝成屬性,設(shè)計構(gòu)造函數(shù),來將表抽取為類。這種類就稱為實體類。這個抽取過程稱為對象關(guān)系映射ORM。在Modal項目中,為數(shù)據(jù)庫的每個表,都設(shè)計一個相應(yīng)的實體類,這樣,就相當(dāng)于對每個表實體,在.NET程序中,都可以通過類對象來應(yīng)用。在上面介紹的3層中,通常都會用到實體類對象。綜上所述,這5個項目之間的關(guān)系是這樣的:圖3.5 三層架構(gòu)中5個項目之間的關(guān)系圖 任務(wù)的設(shè)計思路1、在上個模塊基于單層的課程管理的基礎(chǔ)上,將原有的WINDOWS窗體應(yīng)用程序的項目,設(shè)置為界面層,改名為UI,界面層的控件部署不用改變,并設(shè)置為啟動項目;2、在解決方案中

8、添加業(yè)務(wù)邏輯層項目BLL、數(shù)據(jù)訪問層項目DAL、Common項目、Modal項目,他們都是類庫型的項目;3、將DBHelepr類移到Common項目中;4、在Modal項目中,為學(xué)生選課管理系統(tǒng)的每個表,設(shè)計對應(yīng)的實體類。5、設(shè)置好引用關(guān)系后,運行,可實現(xiàn)課程記錄的添加和瀏覽。注意:此時,3層結(jié)構(gòu)雖已架設(shè)好,運行也可實現(xiàn)課程管理的記錄添加和瀏覽功能。但是運行的仍是界面層代碼,其余層的代碼尚未設(shè)計。 任務(wù)的實施1、在原來的版本中,用1個WINDOWS窗體應(yīng)用項目就實現(xiàn)了課程管理,在3層架構(gòu)體系中,當(dāng)然,這個項目就是界面層。首先,把原有的項目改名為UI,右擊此項目,改名即可。然后,右擊解決方案,選

9、擇“設(shè)置啟動項目”,即可將界面層項目設(shè)置為啟動項目。2、右擊解決方案,分別生成4個新的項目,這些項目均是類庫項目,按照慣例,數(shù)據(jù)訪問層項目起名為DAL,業(yè)務(wù)邏輯層項目起名為BLL, 另外2個項目起名為Common和Modal。3、右擊Common,選擇“添加”里的“現(xiàn)有項”,將DBHelper類添加入此項目。右擊UI下原有的DBHelper類文件,選擇“從項目中排除”。就實現(xiàn)了將DBHelepr類移到Common項目中。將命名空間改為BFCourse.Common,其中BFCourse為解決方案名。以后每個項目中的每個文件,都需要在前面加上解決方案名,這樣,就都處于同一個命名空間BFCours

10、e。4、在Modal項目中,選擇添加新建項,參考課程表的抽取方法,為學(xué)生選課管理系統(tǒng)的每個表,設(shè)計對應(yīng)的實體類。同理,命名空間改為BFCourse. Modal。5、此時,界面層代碼會顯示DBHelper找不到,因為移到了Common項目。所以,必須在界面層項目UI中添加對Common項目的引用。然后,整個系統(tǒng)就可以運行了。當(dāng)然,雖然形式是3層的,但實際運行的是UI和Common中的代碼。 舉一反三1、把選課系統(tǒng)數(shù)據(jù)庫的另外3張表,學(xué)生表、選課表和用戶表,都進行對象關(guān)系映射,為其生成實體類。2、在包含5個項目的3層架構(gòu)的系統(tǒng)中,為DAL、BLL項目添加類文件,只需添加空文件,但命名方式按各層的

11、功能需求設(shè)計,將所有需要的類文件添加齊全。-任務(wù)3-2:課程添加的3層實現(xiàn) 效果與描述效果圖仍然如圖2.1所示,實現(xiàn)課程記錄的添加。但需要用3層的技術(shù)來實現(xiàn)。首先,回顧一下,記錄添加的業(yè)務(wù)流程,如圖2.14所示。要判斷輸入的完整性;然后判斷輸入的課程號主鍵在數(shù)據(jù)庫中是否已有;若無,則插入記錄到數(shù)據(jù)庫中。然后,根據(jù)業(yè)務(wù)需求,從底到高來設(shè)計每層。單純的判斷記錄有無、單純的記錄添加操作,就可以放在數(shù)據(jù)訪問層。記錄添加的邏輯功能:判斷輸入的課程號主鍵在數(shù)據(jù)庫中是否已有,若無,則插入記錄到數(shù)據(jù)庫中,則由業(yè)務(wù)邏輯層調(diào)用數(shù)據(jù)訪問層的添加方法來實現(xiàn);最后,在界面層,其控件部署不用改變,只需判斷文本框的輸入完整

12、性,然后調(diào)用業(yè)務(wù)邏輯層的添加方法就可以了。本任務(wù)的設(shè)計流程如下:圖3.6 數(shù)據(jù)添加的3層設(shè)計流程 相關(guān)知識與技能3-2-1 數(shù)據(jù)訪問層的方法設(shè)計一般為系統(tǒng)數(shù)據(jù)庫中的每個表設(shè)計一個數(shù)據(jù)訪問類,實現(xiàn)基本的記錄操作。為了實現(xiàn)課程記錄的添加,目前,可在數(shù)據(jù)訪問類包含如下方法:1、 判斷某主鍵的記錄是否存在方法名:Exist形參:代表主鍵的變量返回值:bool方法內(nèi)代碼設(shè)計:(1) 設(shè)計語句select * from 表 where 主鍵名=形參(2) 利用using語句,調(diào)用DBHelper類,生成一個datareader對象(3) 利用HasRows 屬性判斷此datareader對象是否有行,若有

13、,返回真,否則返回假。應(yīng)用場合:在插入記錄前判斷,若有則不用再插;在刪除記錄前判斷,若有則不能刪。2、方法名:AddXX形參:代表此表實體類的對象返回值:int方法內(nèi)代碼設(shè)計:(1) 設(shè)計語句insert(2) 調(diào)用DBHelper類,用ExeccuteNonQuery()方法執(zhí)行此語句并返回。應(yīng)用場合:在表中添加一條記錄,根據(jù)返回值是否大于0判斷執(zhí)行成功否。3-2-2 業(yè)務(wù)邏輯層的方法設(shè)計一般為系統(tǒng)中的每個功能模塊設(shè)計1個業(yè)務(wù)邏輯層的類,實現(xiàn)此模塊的所有業(yè)務(wù)邏輯。在課程添加中,所需要的業(yè)務(wù)邏輯為課程添加。首先,由于需要調(diào)用數(shù)據(jù)訪問類CourseAccess,因此,在類內(nèi)設(shè)計1個字段為此類對象

14、: CourseAccess courseAccess = new CourseAccess();其次,此類需要設(shè)計如下方法:1、 添加課程方法名:AddXX形參:課程類對象返回值:void方法內(nèi)代碼設(shè)計:(1) 調(diào)用CourseAccess類對象的Exist()方法,判斷形參所表示的課程類對象是否存在,若存在方法返回;(2) 調(diào)用CourseAccess類對象的AddCourse()方法,添加課程,并利用返回值判斷添加是否成功。3-2-3 界面層的設(shè)計界面層的設(shè)計,首先需要根據(jù)用戶的功能需求部署恰當(dāng)控件,這些控件部署在第2模塊已實現(xiàn),不用改變。然后,把功能實現(xiàn)代碼放在恰當(dāng)控件的恰當(dāng)事件中,在

15、這些代碼中,需要調(diào)用業(yè)務(wù)邏輯層的方法實現(xiàn)。課程添加時,界面上主要的功能如下:1、 按下添加按鈕,實現(xiàn)課程記錄的插入(1) 代碼放在按鈕的CLICK事件中;(2)代碼設(shè)計思路:首先進行控件的輸入正確性驗證;其次利用控件的輸入值,生成1個課程實體類對象;利用此對象,調(diào)用業(yè)務(wù)邏輯類對象的AddCourse()方法,插入記錄;最后刷新瀏覽。 任務(wù)的設(shè)計思路1、在DAL項目中新建針對課程表的數(shù)據(jù)訪問類文件,將所需的2個方法設(shè)計在內(nèi)。2、在BLL項目中新建針對課程管理的業(yè)務(wù)邏輯類文件,并設(shè)計相關(guān)方法。3、優(yōu)化界面層代碼,調(diào)用業(yè)務(wù)邏輯層類的方法,實現(xiàn)添加。4、在DAL項目中,要用到DBHelper類和課程實

16、體類Course,分別位于Common和Modal項目中,所以,必須在項目中加入對此2個項目的引用。同理,BLL項目中,要用到CourseAccess類和課程實體類Course,分別位于DAL和Modal項目中,所以,必須在項目中加入對此2個項目的引用。UI項目中,要用到CourseBiz類和課程實體類Course,分別位于BLL和Modal項目中,所以,必須在項目中加入對此2個項目的引用。 任務(wù)的實施1、右擊DAL項目,選擇新建類文件,命名為:CourseAccess.cs。命名空間改為BFCourse. DAL。右擊項目,選擇添加引用,選中項目里的Common和Modal,然后添加引用語句

17、:using BFCourse.Modal;using BFCourse.Common。2、CourseAccess類中判斷某課程記錄是否存在的方法:/ / 根據(jù)課號判斷此課程是否存在 / / / public bool Exist(string courseId) string strSql = string.Format(select * from course where courseId=0,courseId); using (OleDbDataReader dr = DBHelper.GetReader(strSql) if (dr.HasRows) return true; els

18、e return false; 3、CourseAccess類中添加課程的方法,注意形參是課程對象/ / 利用課程對象添加課程 / / / public int AddCourse(Course course) string strSql = string.Format(insert into course values(0,1,2),course.CourseId,course.CourseName,course.CourseCredit); return DBHelper.ExecNonQuery(strSql); 4、右擊BLL項目,選擇新建類文件,命名為:CourseBiz.cs。命名

19、空間改為BFCourse. BLL。右擊項目,選擇添加引用,選中項目里的DAL和Modal,然后添加引用語句:using BFCourse.Modal;using BFCourse.DAL。5、CourseBiz類部分代碼public class CourseBiz CourseAccess courseAccess = new CourseAccess(); / / 判斷邏輯,插入課程 / / public void AddCourse(Course course) if (courseAccess.Exist(course.CourseId) MessageBox.Show(此課程號已存在

20、,請重新輸入); return; if (courseAccess.AddCourse(course) 0) MessageBox.Show(添加成功); else MessageBox.Show(添加失敗); 6、右擊UI項目,命名空間改為BFCourse. UI。右擊項目,選擇添加引用,選中項目里的BLL和Modal,然后添加引用語句:using BFCourse.Modal;using BFCourse.BLL。7、界面層重構(gòu)的部分代碼private void buttonAdd_Click(object sender, EventArgs e) if (textBox1.Text =

21、String.Empty) MessageBox.Show(請輸入課程編號); return; if (textBox2.Text = String.Empty) MessageBox.Show(請輸入課程名稱); return; if (textBox3.Text = String.Empty) MessageBox.Show(請輸入課程學(xué)分); return; string courId = textBox1.Text.Trim(); string courName = textBox2.Text.Trim(); int courCredit = Convert.ToInt32(textB

22、ox3.Text.Trim(); Course course = new Course(courId, courName, courCredit);CourseBiz cb= new CourseBiz(); cb.AddCourse(course); 此時運行系統(tǒng),記錄添加的部分就是由這3層實現(xiàn)的,界面層按下“添加”按鈕后,調(diào)用BLL層的void AddCourse(Course course)方法,此方法又調(diào)用DAL層的bool Exist(string courseId) 和int AddCourse(Course course)方法,它們再調(diào)用DBHelper中的具體數(shù)據(jù)記錄操作方法。

23、是一個標準的3層架構(gòu)調(diào)用機制??偨Y(jié):3層架構(gòu)設(shè)計時,根據(jù)功能需求,從下而上設(shè)計,實際運行時,從上而下調(diào)用。圖3.7 課程添加的3層調(diào)用流程 舉一反三1、-任務(wù)3-3:課程刪除的3層實現(xiàn) 效果與描述圖3.8 添加課程刪除功能后的課程管理界面效果圖如圖 所示,為了實現(xiàn)課程記錄的刪除,需要按主鍵刪除,所以添加了課程號的文本框和刪除按鈕。用3層的技術(shù)來實現(xiàn)。首先,也需要理順記錄刪除的業(yè)務(wù)流程,如下圖 所示。圖3.9 課程刪除的業(yè)務(wù)流程要判斷輸入的完整性;然后判斷輸入的課程號主鍵在數(shù)據(jù)庫中是否已有;若有,則刪除該主鍵的記錄。然后,根據(jù)業(yè)務(wù)需求,從底到高來設(shè)計每層。單純的判斷記錄有無,已在上個任務(wù)實現(xiàn);單

24、純的記錄刪除操作,就可以添加在課程表的數(shù)據(jù)訪問層類。記錄刪除的邏輯功能:判斷輸入的課程號主鍵在數(shù)據(jù)庫中是否已有,若有,則刪除記錄,由業(yè)務(wù)邏輯層添加調(diào)用數(shù)據(jù)訪問層的刪除方法來實現(xiàn);最后,在界面層,只需判斷文本框的輸入完整性,然后調(diào)用業(yè)務(wù)邏輯層的刪除方法。本任務(wù)的設(shè)計流程如記錄添加的設(shè)計流程,不再贅述。 相關(guān)知識與技能3-3-1 數(shù)據(jù)訪問層的方法設(shè)計在上個任務(wù)的CourseAccess類中,為了實現(xiàn)刪除,需要添加的方法有:1、刪除記錄方法名:DelXX形參:代表主鍵的變量課程號返回值:int方法內(nèi)代碼設(shè)計:(1) 設(shè)計語句delete(2) 調(diào)用DBHelper類,用ExeccuteNonQuer

25、y()方法執(zhí)行此語句并返回應(yīng)用場合:在表中刪除一條記錄,根據(jù)返回值是否大于0判斷執(zhí)行成功否。3-3-2 業(yè)務(wù)邏輯層的方法設(shè)計在上個任務(wù)的CourseBiz類中,為了實現(xiàn)刪除,需要添加的方法有:1、刪除課程方法名:DelXX形參:代表主鍵的變量課程號返回值:void方法內(nèi)代碼設(shè)計:(1) 調(diào)用CourseAccess類對象的Exist()方法,判斷形參的課程類對象是否存在,若不存在方法返回;(2) 調(diào)用CourseAccess類對象的DelCourse()方法,刪除課程,并利用返回值判斷添加是否成功。3-3-3 界面層的設(shè)計界面層的設(shè)計,部署恰當(dāng)控件后,把功能實現(xiàn)代碼放在恰當(dāng)控件的恰當(dāng)事件中。課

26、程刪除時,界面上主要的功能如下:1、 按下刪除按鈕,實現(xiàn)課程記錄的刪除(1)代碼放在按鈕的CLICK事件中;(2)代碼設(shè)計思路:首先進行控件的輸入正確性驗證;將控件的值放在某變量中;利用此變量作為實參,調(diào)用業(yè)務(wù)邏輯類對象的DelCourse()方法,刪除記錄;最后刷新瀏覽。 任務(wù)的設(shè)計思路1、在DAL項目中CourseAccess類,添加刪除課程的方法。2、在BLL項目中CourseBiz類,添加課程刪除相關(guān)方法。3、優(yōu)化界面層代碼,調(diào)用業(yè)務(wù)邏輯層類的方法,實現(xiàn)刪除。 任務(wù)的實施1、在CourseAccess類中,添加如下方法:刪除課程,注意形參是課程號/ / 根據(jù)課程號刪除課程 / / /

27、public int DelCourse(string courseId) string strSql = string.Format(delete from course where courseId=0, courseId); return DBHelper.ExecNonQuery(strSql); 2、在CourseBiz類中,添加如下方法:/ / 判斷邏輯,刪除課程 / / public void DelCourse(string courseId) if (!courseAccess.Exist(courseId) MessageBox.Show(此課程號不存在,請重新輸入); r

28、eturn; if (courseAccess.DelCourse(courseId) 0) MessageBox.Show(添加成功); else MessageBox.Show(添加失敗); 3、界面層重構(gòu)的代碼如下:private void buttonDel_Click(object sender, EventArgs e) if (textBox4.Text = String.Empty) MessageBox.Show(請輸入課程編號); return; string courId = textBox4.Text.Trim(); CourseBiz cb= new CourseBi

29、z(); cb.DelCourse(courId); 此時運行系統(tǒng),記錄刪除的部分就是由這3層實現(xiàn)的,界面層按下“刪除”按鈕后,調(diào)用BLL層的void DelCourse(string courseId)方法,此方法又調(diào)用DAL層的bool Exist(string courseId) 和int DelCourse(string courseId)方法,它們再調(diào)用DBHelper中的具體數(shù)據(jù)記錄操作方法。也是一個標準的3層架構(gòu)調(diào)用機制。圖3.10 課程刪除的3層調(diào)用流程 舉一反三1、-任務(wù)3-4:課程瀏覽的3層實現(xiàn) 效果與描述在上面2個任務(wù)中,利用3層架構(gòu),實現(xiàn)了課程記錄的添加和刪除。在記錄添

30、加和刪除后,都需要重新刷新課程表的瀏覽;在窗體加載時,也需要在數(shù)據(jù)網(wǎng)格中瀏覽課程表當(dāng)前所有記錄?;?層架構(gòu)的課程記錄瀏覽還未實現(xiàn)。記錄瀏覽的業(yè)務(wù)流程比較簡單,就是再窗體加載時,添加、刪除記錄后,瀏覽課程表當(dāng)前的而所有記錄。記錄瀏覽在本質(zhì)上就是:給數(shù)據(jù)網(wǎng)格提供數(shù)據(jù)源。數(shù)據(jù)源要求是1個數(shù)據(jù)表DateTable,或者是1種集合:如數(shù)組、集合、泛型集合等。根據(jù)業(yè)務(wù)需求,從底到高來設(shè)計每層。在課程表的數(shù)據(jù)訪問層類,添加瀏覽方法,將課程表的當(dāng)前所有記錄取出,并放入集合。在課程管理的業(yè)務(wù)邏輯層類,添加瀏覽方法,調(diào)用數(shù)據(jù)訪問層的新方法,取得此集合;最后,在界面層,在恰當(dāng)控件的恰當(dāng)事件里,調(diào)用業(yè)務(wù)邏輯層的瀏覽

31、方法。本任務(wù)的設(shè)計流程如記錄添加的設(shè)計流程,不再贅述。 相關(guān)知識與技能在本任務(wù)中,需要用到新的知識點:集合和泛型集合。3-4-1 泛型集合的定義與使用集合好比容器,將一系列相似的對象組合在一起,集合中包含的對象稱為集合元素。.NET 中,集合可分為泛型集合類和非泛型集合類。泛型集合類一般位于system.Collections.Generic命名空間,非泛型集合類位于System.Collections命名空間,除此之外,在System.Collection. Specialized命名空間中也包含了一些有用的集合類。1、非泛型集合System.Collections命名空間下的.NET非泛型

32、集合類如下所示:System.Collections.ArrayList:數(shù)組集合類System.Collections.BitArray:布爾集合類System.Collections.Queue:隊列System.Collections.Stack:堆棧System.Collections.Hashtable:哈希表System.Collections.SortedList:排序集合類非泛型集合操作直觀,但由于集合中的對象是Object類型,如果集合中需要存放其它類型的對象,則每次使用都必須進行繁瑣的類型轉(zhuǎn)換。因此,一般情況下,泛型集合用的比較多。2、泛型泛型就好比Word中的模板,在定義

33、Word模板時,對具體編輯哪種類型的文檔是未知的。在.NET中,泛型提供了類、結(jié)構(gòu)、接口和方法的模板,定義泛型時的具體類型也是未知的。例如,可以定義一個泛型類:class FX private T x; public FX() public FX(T x) this.x = x; public T num() return x; 此類表示一種模板,此模板中包含一個字段,2個構(gòu)造函數(shù),和一個返回字段值的方法,字段和方法的類型都是未知的。實例化此類可以是:FX f=new FX(3); 表示用整型來實例化,并為字段賦值為3。也可以這樣實例化:FX g = new FX(3.4); 表示用實型進行實

34、例化,并為字段賦值3.4。所以,實例化泛型類必須在內(nèi)填上確定的類型,表示此模板目前作用于什么類型。3、泛型集合在3層結(jié)構(gòu)的應(yīng)用程序中,用到的泛型集合System.Collections.Generic命名空間下的.NET泛型集合類主要是:System.Collections.Generic .List類。查閱msdn的List(Of T) 類,對泛型集合進行定義和使用。(1)定義ListT集合名=newListT();表示定義1個List類的泛型集合,集合中對象的類型為T。其中的T就是所要使用的類型,既可以是簡單類型,如string、int,也可以是用戶自定義類型如course類。(2)屬性C

35、ount:獲取集合中實際包含的元素數(shù)Item:獲取或設(shè)置指定索引處的元素 (3)方法Add(T item):將對象添加到 List 的結(jié)尾處。 例如以下代碼:class Person private string name; private int age; public Person() public Person(string name, int age) =name; this.age=age; private void button1_Click(object sender, EventArgs e) List pList = new List(); string n

36、ame = textBox1.Text.Trim(); int age = Convert.ToInt32(textBox2.Text.Trim(); Person p = new Person(name,age); pList.Add(p); dataGridView1.DataSource = pList; 定義了1個Person類的泛型列表后,可以將Person類的對象放入此集合,并作為數(shù)據(jù)網(wǎng)格的數(shù)據(jù)源。3-4-2 數(shù)據(jù)訪問層的方法設(shè)計在上個任務(wù)的CourseAccess類中,為了實現(xiàn)瀏覽,需要添加的方法有:1、獲取此表的所有記錄方法名:GetXXList形參:無返回值:此表實體類的泛型

37、集合方法內(nèi)代碼設(shè)計:(1) 設(shè)計語句select * from 表 (2) 定義此表實體類的泛型集合對象(3) 利用using語句,調(diào)用DBHelper類,生成一個datareader對象(4) 利用Read()方法讀此datareader對象的所有行,每讀1行,取到此表實體類的對象中,添加入泛型集合,返回泛型集合對象。應(yīng)用場合:取整個表的所有記錄,作為數(shù)據(jù)展示控件(如數(shù)據(jù)網(wǎng)格)的數(shù)據(jù)源。3-4-3 業(yè)務(wù)邏輯的方法設(shè)計在上個任務(wù)的CourseBiz類中,為了實現(xiàn)瀏覽,需要添加的方法有:1、課程瀏覽方法名:GetXXList形參:無返回值:void方法內(nèi)代碼設(shè)計:(1)調(diào)用CourseAcces

38、s類對象的GetCourseList ()方法,返回課程泛型集合類。3-4-3 界面層代碼的重構(gòu)課程瀏覽時,界面上主要的功能如下:1、窗體加載時,代碼放在LOAD事件中,調(diào)用業(yè)務(wù)邏輯類對象的GetCourseList()方法,實現(xiàn)瀏覽。2、添加或刪除記錄成功后,在原有代碼中添加,調(diào)用業(yè)務(wù)邏輯類對象的GetCourseList()方法,實現(xiàn)瀏覽。 任務(wù)的設(shè)計思路1、在DAL項目中CourseAccess類,添加瀏覽課程的方法。2、在BLL項目中CourseBiz類,添加課程瀏覽相關(guān)方法。3、優(yōu)化界面層代碼,調(diào)用業(yè)務(wù)邏輯層類的方法,在3個場合實現(xiàn)瀏覽。 任務(wù)的實施1、在CourseAccess類中

39、,添加如下方法:/ / 獲取課程列表 / / public List GetCourseList() string strSql = string.Format(select * from course); List list=new List(); using (OleDbDataReader dr = DBHelper.GetReader(strSql) while (dr.Read() Course course = new Course(); course.CourseId = drcourseId.ToString(); course.CourseName = drcourseName.ToString(); course.Cour

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論