C# 實體類


3.1      使用實體類構建三層結構概述

 

在上一章中的三層架構中,我們使用DataSet來進行數據的傳遞,但在OOP的開發中,有很大的局限性:

1.   DataSet不具備良好的面向對象特性,使用起來不夠直觀、方便。

2.   對DataSet中的數據進行查找時容易出錯。例如:我們要查詢DataSet中學員信息DataTable中的某個值時,必須指定行索引與列名,這只是一個簡單的查詢,如果稍微復雜就需要遍歷所有的行集。

3.   由於DataSet的核心結構與數據庫的核心結構完全相同,所以它把數據結構完全暴露在表示層和業務邏輯層。

 

使用實體類的主要好處來自一個簡單的事實,即實體類是完全受我們控制的對象,它具有面向對象的基本特征。我們可以自由地向實體類添加行為(如:判斷是否為空,如果為空指定默認值,這只是一個簡單的擴展。其實和DataSet一樣,業務實體也承載着一個數據載體的任務,實體類在三層結構中的應用如下圖所示:

 

 

 

                                                 3.2 業務實體類

 業務實體類術語叫“Data Transfer Object(數據傳輸對象)”,主要用來在各層間傳輸數據,因此沒有定義方法,當然有需要定義一些驗證是否有效的方法。

 

 

                                                 3.3 實體類的使用

 

在表示層中使用實體類需要做兩件事。

(1)將解析實體對象中封裝的數據展示給用戶。

當表示層接收到從業務邏輯層返回的實體對象,並將實體對象中封裝的信息展示給用戶時,表示層需要對實體對象中封裝的信息進行解析。表示層對實體對象的解析分兩種情況:

第一種是對單個實體對象進行解析,這種解析一般常用的數據展示控件為:TextBox(文本框)、Label(標簽)等控件,它們通常有一個Text屬性用於展示數據。可以通過業務實體對象的屬性獲得實體對象中的數據,將獲得的屬性值賦給“Text”屬性。

第二種是對實體對象集合進行解析。將多個業務實體對象封裝到List<T>中稱為實體對象集合,對實體對象集合的解析,Visual Studio中已經封裝好的控件如:DataGridView(數據表格視圖)控件、ComboBox(下拉列表)控件等,它們都有一個數據源屬性(DataSource),可以直接將實體對象集合綁定到數據源屬性上。

 

(2)將用戶請求的數據封裝到實體對象中

在表示層,我們如何將用戶請求的數據封裝到實體對象中,我們首先需要實例化實體對象,然后將用戶的請求賦值給實體對象中的對應的屬性。

 

3.3.1在表示層使用實體類:如下圖所示:

         

 

表示層使用實體類用於封裝數據或對實體數據進行解析。

 

3.3.2     在業務邏輯層中使用實體類

 

業務邏輯層實體類的使用不同於表示層,它主要負責傳輸實體對象,並對實體對象中封裝的數據進行處理。需要做兩件事情:

(1)將接收到得實體對象傳輸到下一層。

當業務邏輯層接收到裝有信息的業務實體對象后,根據請求或響應將實體對象傳到下一層。

(2)根據用戶請求對實體對象中的數據進行處理。

當我們使用實體類開發三層應用程序時,數據處理來自兩個方面。

一.           業務實體對數據的處理,實體類本身是由屬性組成的,而大多都是可讀可寫屬性。所以,根據請求的不同可以給屬性設置不同的值,例如:當用戶的請求為空時,給屬性設置默認值。

二.           業務邏輯對數據的處理,例如:用戶登錄,用戶的身份分管理員和普通員工,此時業務邏輯層根據用戶身份分別進行不同的處理。

業務邏輯層使用實體類如下圖所示:

 

3.3.3 在數據訪問層中使用實體類

 

在數據訪問層中使用實體類需要做兩件事情。

(1)將數據庫中的數據封裝到實體對象中或將多個實體對象封裝成集合。

當用戶的請求時數據查詢請求時,數據訪問層需要實現對數據庫的查詢訪問。當請求的結果只有一條記錄時,我們將這條記錄封裝成一個實體對象。當請求的結果是多條記錄時,我們將每一條記錄封裝成一個實體對象,然后再將多個實體對象封裝成集合(將多個實體對象封裝到List<T>中)。

(2)將實體對象中的數據保存到數據庫中。

當用戶的請求是數據保存請求時,數據訪問層首先對實體對象中封裝的數據進行解析,然后將解析出的數據保存到數據庫中。

數據訪問層使用實體類如下圖所示:

 

1

 

2

 

 

                  

 

    實體類為我們整個項目的開發提供了很大的靈活性。它把數據庫中的表用面向對象的思想抽象成類,使數據作為對象來使用,消除了關系數據與表之間的差別,在三層結構開發中使用實體類更有助於項目的維護、擴展,更能體現三層結構開發的優勢。

 

通過上面的學習,我們學到了如下知識:

n       為什么在三層結構中使用實體類、實體類的含義及如何自定義實體類。

n       如何將用戶請求的數據封裝到實體對象中,以及如何解析得到實體對象中的數據。

n       如何返回多個實體對象。

 

 

3.4 項目實戰:使用業務實體類代替DataSet

在本章我們使用使用業務實體類代替DataSet實現三層結構,首先我們在三層結構框架下添加一個業務實體項目,如下圖所示:

 

 

在第一章的基礎上,我們現將完成本章任務的步驟概括如下:

(1)實現業務實體

①、         新增項目Model

②、         在其他項目中添加對業務實體項目的引用

③、         添加需求所用數據庫中表對應的實體類

④、         編寫業務實體類

(2)設計用戶界面

(3)實現數據訪問層

(4)實現業務邏輯層

(5)實現表示層數據綁定

 

3.4.1 創建業務實體項目

 

(1)在已經搭建的三層結構解決方案上,右鍵單擊項目名,選擇“添加”->“新建項目”命令,如下圖所示:

 

 

 

 

(2)在彈出的“添加新項目”對話框中選擇項目類型為“Visual C#”,模板為”類庫”,並填寫項目名稱為“Model”,單擊“確定”按鈕,如下圖所示:

 

 

(3)業務實體項目添加完畢。根據業務實體在三層結構中的作用與地位,我們需要添加表示層、數據訪問層以及業務邏輯層對業務實體的依賴。依賴關系如下圖所示:

 

 

下面我們根據本章任務所需,添加業務實體類。

(1)在業務實體項目“Model”項目上右擊,選擇“添加”->“新建項”命令,如下圖所示:

 

 

(2)依次添加管理員實體類(Admin)、學期信息類(Sem)、學生信息類(Student)、科目信息類(Subject)。學期信息類(Sem)代碼如下:

示例1:

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Model

{

    [Serializable]

    public class Sem

    {

        private intid;

 

        public intId

        {

            get {return id; }

            set { id = value; }

        }

        privatestring semName;

 

        publicstring SemName

        {

            get {return semName; }

            set {semName = value; }

        }

        privateshort lessonNum;

 

        public shortLessonNum

        {

            get {return lessonNum; }

            set {lessonNum = value; }

        }

        privatefloat spending;

 

        public floatSpending

        {

            get {return spending; }

            set {spending = value; }

        }

 

        public Sem()

        {

           

        }

    }

}

 

根據數據編寫實體類時,我們需要注意以下幾點。

(1)表中的每一個字段,對應實體類中的一個private(或protected)類型的字段和一個public類型的屬性。

(2)表中字段的類型要與屬性的類型相匹配。例如:數據庫中的char、varchar類型與C#中的string類型匹配。

(3)在業務實體類前面一半要加上序列化屬性[Serializable],它會對實體類中的所有字段、屬性進行序列化處理,序列化的主要目的是為了提高數據傳輸中的性能與安全性。

 

3.4.3 實現數據訪問層

 

    在編寫數據訪問層之前,首先接觸下using語句。using語句作為關鍵字,在第一學期主要用於引用命名空間。

    作為語句,using語句允許用戶定義一個范圍,並在此范圍內末尾自動釋放對象。例如在using語句范圍內定義了一個數據庫連接對象,當程序執行到using語句末尾時,將自動釋放此數據庫連接對象,從而大大簡化了代碼,並在一定程度上提高了資源使用效率。

    完成本章任務需要使用的對象如下:

(1)實例化SqlConnection對象,實現數據庫連接。

(2)實例化SqlCommand對象,執行Sql命令。

(3)實例化SqlDataReader對象,讀取數據。

(4)使用實體對象傳遞數據。

(5)使用List<T>傳遞實體對象集合。

 

當我們掌握了Ado.NET、實體類、List<T>、using語句的使用時,我們現在實現對他們的綜合使用。

 

3.4.3 實現業務邏輯層

 

在實現業務邏輯層之前,我們對實現的步驟進行一個簡單概括。

(1)在業務邏輯處理類中引用數據訪問層命名空間、業務實體命名空間。

(2)實例化業務實體對象。

(3)實例化數據訪問對象。

(4)調用數據訪問功能。

(5)實現業務邏輯功能。

根據數據訪問層實現的功能,業務邏輯層主要完成根據不同的用戶類型調用不同的數據訪問方法,通過判斷用戶類型得到學員用戶的用戶狀態信息。

 

3.4.4實現表示層數據綁定

 

表示層主要實現的功能有:根據用戶輸入的信息判斷是否為空,是否為有效狀態,驗證是否通過等。

 

//本章代碼,詳見代碼共享區

 

小結:

n       用OOP實現三層架構時,業務實體類是三層之間數據傳遞的載體。

n       在使用實體類開發三層結構時,用戶的請求需要返回實體對象集合時,可使用List<T>實現。

n       using關鍵字在C#中有兩種用途

1.   作為指令,引用命名空間;

2.   作為語句,用於定義一個范圍,在此范圍末自動釋放對象。

n     在三層結構中,我們使用實體類消除關系數據庫與類之間的差別,以更好地使用OOP的思想來架構我們的系統。

 

作業:

完善第二章自己已經架構好的MIS系統,豐富完善數據訪問層、業務邏輯層和表示層,使用業務實體類來在各層之間傳輸數據。

 

 

 

 

 

3.1      使用實體類構建三層結構概述

 

在上一章中的三層架構中,我們使用DataSet來進行數據的傳遞,但在OOP的開發中,有很大的局限性:

1.   DataSet不具備良好的面向對象特性,使用起來不夠直觀、方便。

2.   對DataSet中的數據進行查找時容易出錯。例如:我們要查詢DataSet中學員信息DataTable中的某個值時,必須指定行索引與列名,這只是一個簡單的查詢,如果稍微復雜就需要遍歷所有的行集。

3.   由於DataSet的核心結構與數據庫的核心結構完全相同,所以它把數據結構完全暴露在表示層和業務邏輯層。

 

使用實體類的主要好處來自一個簡單的事實,即實體類是完全受我們控制的對象,它具有面向對象的基本特征。我們可以自由地向實體類添加行為(如:判斷是否為空,如果為空指定默認值,這只是一個簡單的擴展。其實和DataSet一樣,業務實體也承載着一個數據載體的任務,實體類在三層結構中的應用如下圖所示:

 

 

 

                                                 3.2 業務實體類

 業務實體類術語叫“Data Transfer Object(數據傳輸對象)”,主要用來在各層間傳輸數據,因此沒有定義方法,當然有需要定義一些驗證是否有效的方法。

 

 

                                                 3.3 實體類的使用

 

在表示層中使用實體類需要做兩件事。

(1)將解析實體對象中封裝的數據展示給用戶。

當表示層接收到從業務邏輯層返回的實體對象,並將實體對象中封裝的信息展示給用戶時,表示層需要對實體對象中封裝的信息進行解析。表示層對實體對象的解析分兩種情況:

第一種是對單個實體對象進行解析,這種解析一般常用的數據展示控件為:TextBox(文本框)、Label(標簽)等控件,它們通常有一個Text屬性用於展示數據。可以通過業務實體對象的屬性獲得實體對象中的數據,將獲得的屬性值賦給“Text”屬性。

第二種是對實體對象集合進行解析。將多個業務實體對象封裝到List<T>中稱為實體對象集合,對實體對象集合的解析,Visual Studio中已經封裝好的控件如:DataGridView(數據表格視圖)控件、ComboBox(下拉列表)控件等,它們都有一個數據源屬性(DataSource),可以直接將實體對象集合綁定到數據源屬性上。

 

(2)將用戶請求的數據封裝到實體對象中

在表示層,我們如何將用戶請求的數據封裝到實體對象中,我們首先需要實例化實體對象,然后將用戶的請求賦值給實體對象中的對應的屬性。

 

3.3.1在表示層使用實體類:如下圖所示:

         

 

表示層使用實體類用於封裝數據或對實體數據進行解析。

 

3.3.2     在業務邏輯層中使用實體類

 

業務邏輯層實體類的使用不同於表示層,它主要負責傳輸實體對象,並對實體對象中封裝的數據進行處理。需要做兩件事情:

(1)將接收到得實體對象傳輸到下一層。

當業務邏輯層接收到裝有信息的業務實體對象后,根據請求或響應將實體對象傳到下一層。

(2)根據用戶請求對實體對象中的數據進行處理。

當我們使用實體類開發三層應用程序時,數據處理來自兩個方面。

一.           業務實體對數據的處理,實體類本身是由屬性組成的,而大多都是可讀可寫屬性。所以,根據請求的不同可以給屬性設置不同的值,例如:當用戶的請求為空時,給屬性設置默認值。

二.           業務邏輯對數據的處理,例如:用戶登錄,用戶的身份分管理員和普通員工,此時業務邏輯層根據用戶身份分別進行不同的處理。

業務邏輯層使用實體類如下圖所示:

 

3.3.3 在數據訪問層中使用實體類

 

在數據訪問層中使用實體類需要做兩件事情。

(1)將數據庫中的數據封裝到實體對象中或將多個實體對象封裝成集合。

當用戶的請求時數據查詢請求時,數據訪問層需要實現對數據庫的查詢訪問。當請求的結果只有一條記錄時,我們將這條記錄封裝成一個實體對象。當請求的結果是多條記錄時,我們將每一條記錄封裝成一個實體對象,然后再將多個實體對象封裝成集合(將多個實體對象封裝到List<T>中)。

(2)將實體對象中的數據保存到數據庫中。

當用戶的請求是數據保存請求時,數據訪問層首先對實體對象中封裝的數據進行解析,然后將解析出的數據保存到數據庫中。

數據訪問層使用實體類如下圖所示:

 

1

 

2

 

 

                  

 

    實體類為我們整個項目的開發提供了很大的靈活性。它把數據庫中的表用面向對象的思想抽象成類,使數據作為對象來使用,消除了關系數據與表之間的差別,在三層結構開發中使用實體類更有助於項目的維護、擴展,更能體現三層結構開發的優勢。

 

通過上面的學習,我們學到了如下知識:

n       為什么在三層結構中使用實體類、實體類的含義及如何自定義實體類。

n       如何將用戶請求的數據封裝到實體對象中,以及如何解析得到實體對象中的數據。

n       如何返回多個實體對象。

 

 

3.4 項目實戰:使用業務實體類代替DataSet

在本章我們使用使用業務實體類代替DataSet實現三層結構,首先我們在三層結構框架下添加一個業務實體項目,如下圖所示:

 

 

在第一章的基礎上,我們現將完成本章任務的步驟概括如下:

(1)實現業務實體

①、         新增項目Model

②、         在其他項目中添加對業務實體項目的引用

③、         添加需求所用數據庫中表對應的實體類

④、         編寫業務實體類

(2)設計用戶界面

(3)實現數據訪問層

(4)實現業務邏輯層

(5)實現表示層數據綁定

 

3.4.1 創建業務實體項目

 

(1)在已經搭建的三層結構解決方案上,右鍵單擊項目名,選擇“添加”->“新建項目”命令,如下圖所示:

 

 

 

 

(2)在彈出的“添加新項目”對話框中選擇項目類型為“Visual C#”,模板為”類庫”,並填寫項目名稱為“Model”,單擊“確定”按鈕,如下圖所示:

 

 

(3)業務實體項目添加完畢。根據業務實體在三層結構中的作用與地位,我們需要添加表示層、數據訪問層以及業務邏輯層對業務實體的依賴。依賴關系如下圖所示:

 

 

下面我們根據本章任務所需,添加業務實體類。

(1)在業務實體項目“Model”項目上右擊,選擇“添加”->“新建項”命令,如下圖所示:

 

 

(2)依次添加管理員實體類(Admin)、學期信息類(Sem)、學生信息類(Student)、科目信息類(Subject)。學期信息類(Sem)代碼如下:

示例1:

using System;

using System.Collections.Generic;

using System.Text;

 

namespace Model

{

    [Serializable]

    public class Sem

    {

        private intid;

 

        public intId

        {

            get {return id; }

            set { id = value; }

        }

        privatestring semName;

 

        publicstring SemName

        {

            get {return semName; }

            set {semName = value; }

        }

        privateshort lessonNum;

 

        public shortLessonNum

        {

            get {return lessonNum; }

            set {lessonNum = value; }

        }

        privatefloat spending;

 

        public floatSpending

        {

            get {return spending; }

            set {spending = value; }

        }

 

        public Sem()

        {

           

        }

    }

}

 

根據數據編寫實體類時,我們需要注意以下幾點。

(1)表中的每一個字段,對應實體類中的一個private(或protected)類型的字段和一個public類型的屬性。

(2)表中字段的類型要與屬性的類型相匹配。例如:數據庫中的char、varchar類型與C#中的string類型匹配。

(3)在業務實體類前面一半要加上序列化屬性[Serializable],它會對實體類中的所有字段、屬性進行序列化處理,序列化的主要目的是為了提高數據傳輸中的性能與安全性。

 

3.4.3 實現數據訪問層

 

    在編寫數據訪問層之前,首先接觸下using語句。using語句作為關鍵字,在第一學期主要用於引用命名空間。

    作為語句,using語句允許用戶定義一個范圍,並在此范圍內末尾自動釋放對象。例如在using語句范圍內定義了一個數據庫連接對象,當程序執行到using語句末尾時,將自動釋放此數據庫連接對象,從而大大簡化了代碼,並在一定程度上提高了資源使用效率。

    完成本章任務需要使用的對象如下:

(1)實例化SqlConnection對象,實現數據庫連接。

(2)實例化SqlCommand對象,執行Sql命令。

(3)實例化SqlDataReader對象,讀取數據。

(4)使用實體對象傳遞數據。

(5)使用List<T>傳遞實體對象集合。

 

當我們掌握了Ado.NET、實體類、List<T>、using語句的使用時,我們現在實現對他們的綜合使用。

 

3.4.3 實現業務邏輯層

 

在實現業務邏輯層之前,我們對實現的步驟進行一個簡單概括。

(1)在業務邏輯處理類中引用數據訪問層命名空間、業務實體命名空間。

(2)實例化業務實體對象。

(3)實例化數據訪問對象。

(4)調用數據訪問功能。

(5)實現業務邏輯功能。

根據數據訪問層實現的功能,業務邏輯層主要完成根據不同的用戶類型調用不同的數據訪問方法,通過判斷用戶類型得到學員用戶的用戶狀態信息。

 

3.4.4實現表示層數據綁定

 

表示層主要實現的功能有:根據用戶輸入的信息判斷是否為空,是否為有效狀態,驗證是否通過等。

 

//本章代碼,詳見代碼共享區

 

小結:

n       用OOP實現三層架構時,業務實體類是三層之間數據傳遞的載體。

n       在使用實體類開發三層結構時,用戶的請求需要返回實體對象集合時,可使用List<T>實現。

n       using關鍵字在C#中有兩種用途

1.   作為指令,引用命名空間;

2.   作為語句,用於定義一個范圍,在此范圍末自動釋放對象。

n     在三層結構中,我們使用實體類消除關系數據庫與類之間的差別,以更好地使用OOP的思想來架構我們的系統。

 

作業:

完善第二章自己已經架構好的MIS系統,豐富完善數據訪問層、業務邏輯層和表示層,使用業務實體類來在各層之間傳輸數據。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM