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)將實體對象中的數據保存到數據庫中。
當用戶的請求是數據保存請求時,數據訪問層首先對實體對象中封裝的數據進行解析,然后將解析出的數據保存到數據庫中。
數據訪問層使用實體類如下圖所示:
|
【
實體類為我們整個項目的開發提供了很大的靈活性。它把數據庫中的表用面向對象的思想抽象成類,使數據作為對象來使用,消除了關系數據與表之間的差別,在三層結構開發中使用實體類更有助於項目的維護、擴展,更能體現三層結構開發的優勢。
】
通過上面的學習,我們學到了如下知識:
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)將實體對象中的數據保存到數據庫中。
當用戶的請求是數據保存請求時,數據訪問層首先對實體對象中封裝的數據進行解析,然后將解析出的數據保存到數據庫中。
數據訪問層使用實體類如下圖所示:
|
【
實體類為我們整個項目的開發提供了很大的靈活性。它把數據庫中的表用面向對象的思想抽象成類,使數據作為對象來使用,消除了關系數據與表之間的差別,在三層結構開發中使用實體類更有助於項目的維護、擴展,更能體現三層結構開發的優勢。
】
通過上面的學習,我們學到了如下知識:
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系統,豐富完善數據訪問層、業務邏輯層和表示層,使用業務實體類來在各層之間傳輸數據。