逐步解說:建立 N-Tier 資料應用程式
更新:2007 年 11 月
N-Tier 資料應用程式是一種存取資料的應用程式,可以分隔成多個邏輯層 (Layer) 或「層」(Tier)。將應用程式元件分隔至不同層 (Tier),可以提高應用程式的可維護性與延展性 (Scalability)。不需重新設計整個方案,就能使套用至單一層 (Tier) 的新技術變得更容易採用。N-Tier 架構包含展示層 (Tier)、中介層 (Middle Tier) 和資料層 (Tier)。中介層 (Tier) 一般包括資料存取層 (Layer)、商務邏輯層 (Layer) 和一些共用元件,例如驗證。資料層 (Tier) 則包括關聯式資料庫。N-Tier 應用程式通常會將敏感性資訊儲存在中介層 (Tier) 的資料存取層 (Layer),以完善隔離存取展示層 (Tier) 的不同使用者。如需詳細資訊,請參閱 N-Tier 資料應用程式概觀。
區分 N-Tier 應用程式中各層的一種方式,就是對要包含在應用程式中的每一層建立不同的專案。具型別資料集包含 DataSet Project 屬性,可用來判斷產生的資料集和 TableAdapter 程式碼應該加入其中的專案。
本逐步解說會示範如何使用 [Dataset 設計工具],將資料集和 TableAdapter 程式碼分隔成不同的類別庫 (Classs Library) 專案。在分隔資料集和 TableAdapter 程式碼之後,將會建立 Windows Communication Foundation 服務和 ADO.NET 資料服務 服務以呼叫資料存取層。最後,您將建立 Windows Form 應用程式做為展示層。這一層會從資料服務存取資料。
在本逐步解說中,您將執行下列步驟:
建立將包含多個專案的新 N-Tier 方案。
將兩個類別庫專案加入至 N-Tier 方案。
使用 [資料來源組態精靈] 建立具型別資料集。
將產生的 TableAdapter 和資料集程式碼分隔至不同的專案。
建立 Windows Communication Foundation (WCF) 服務以呼叫資料存取層。
在服務中建立函式,以便從資料存取層擷取資料。
建立 Windows Form 應用程式做為展示層使用。
建立繫結至資料來源的 Windows Form 控制項。
撰寫程式碼以填入資料表。
如需觀看示範影片,請參閱影片 HOW TO:建立 N-Tier 資料應用程式 (英文)。
必要條件
若要完成這個逐步解說,您將需要:
- Northwind 範例資料庫的存取權。如需詳細資訊,請參閱 HOW TO:安裝範例資料庫。
建立 N-Tier 方案和類別庫以保留資料集 (DataEntityTier)
本逐步解說的第一個步驟,是建立一個方案和兩個類別庫專案。第一個類別庫將保留資料集 (所產生的具型別 DataSet 類別和 DataTables 將保留應用程式的資料)。這個專案會當做應用程式的資料實體層 (Layer) 使用,而且通常位於中介層 (Tier)。您可以使用 DataSet 設計工具建立初始資料集,並自動將程式碼分隔至兩個類別庫。
注意事項: |
---|
在您按一下 [確定] 之前,請務必確定專案和方案的名稱都正確無誤。這樣做可讓您更容易完成本逐步解說。 |
若要建立 N-Tier 方案和 DataEntityTier 類別庫
從 [檔案] 功能表中,建立新專案。
注意事項: Visual Basic 和 C# 專案都支援 [Dataset 設計工具]。請以其中一種語言建立新的專案。
在 [新增專案] 對話方塊的 [專案類型] 窗格中,按一下 [Windows]。
按一下 [類別庫] 範本。
將專案命名為 DataEntityTier。
將方案命名為 NTierWalkthrough。
按一下 [確定]。
其中包含 DataEntityTier 專案的 NTierWalkthrough 方案隨即建立並加入至 [方案總管]。
建立類別庫以保留 TableAdapters (DataAccessTier)
在您建立 DataEntityTier 專案之後的下一步便是建立另一個類別庫專案。這個專案將保留產生的 TableAdapter,並且稱為應用程式的「資料存取層」(Data Access Tier)。資料存取層包含連接至資料庫時所需的資訊,而且通常都位於中介層。
若要建立 TableAdapters 的新類別庫
在 [檔案] 功能表中,將新專案加入至 NTierWalkthrough 方案。
在 [新增專案] 對話方塊的 [範本] 窗格中,按一下 [類別庫]。
將專案命名為 DataAccessTier,然後按一下 [確定]。
DataAccessTier 專案隨即建立並加入至 NTierWalkthrough 方案。
建立資料集
下一步則是建立具型別資料集。具型別資料集是使用單一專案中的資料集類別 (包括 DataTables 類別) 和 TableAdapter 類別建立 (所有類別都會產生至單一檔案中)。當您將資料集和 TableAdapter 分隔至不同的專案時,資料集類別會移至其他專案,而 TableAdapter 類別則留在原始專案中。因此,請在最終將包含 TableAdapter 的專案 (DataAccessTier 專案) 中建立資料集。您將使用 [資料來源組態精靈] 建立資料集。
注意事項: |
---|
您必須可以存取 Northwind 範例資料庫,才能建立連接。如需如何設定 Northwind 範例資料庫的詳細資訊,請參閱 HOW TO:安裝範例資料庫。 |
建立資料集
按一下 [方案總管] 中的 [DataAccessTier]。
在 [資料] 功能表上,按一下 [顯示資料來源]。
在 [資料來源] 視窗中,按一下 [加入新資料來源],啟動 [資料來源組態精靈]。
在 [選擇資料來源類型] 頁面上,按一下 [資料庫],然後按 [下一步]。
在 [選擇資料連接] 頁面上,執行下列其中一個動作:
如果下拉式清單中提供 Northwind 範例資料庫的資料連接,請按一下這個資料連接。
-或-
按一下 [新增連接] 開啟 [加入連接] 對話方塊。如需詳細資訊,請參閱新增/修改連接對話方塊 (一般)。
如果資料庫需要密碼,請選取選項以輸入機密資料,然後按一下 [下一步]。
注意事項: 如果選取了本機資料庫檔案 (而非連接至 SQL Server),可能會出現提示,詢問您是否要將檔案加入至專案。請按一下 [是],將資料庫檔案加入至專案。
在 [將連接字串儲存到應用程式組態檔] 頁面上,按一下 [下一步]。
在 [選擇您的資料庫物件] 頁面上,展開 [資料表] 節點。
按一下 [Customers] 和 [Orders] 資料表的核取方塊,然後按一下 [完成]。
NorthwindDataSet 隨即加入至 DataAccessTier 專案,並出現在 [資料來源] 視窗中。
將資料集和 TableAdapter 分開
在您建立資料集之後,請將 TableAdapter 和產生的資料集類別分開。只要將 [資料集專案] 屬性設定為要在其中儲存分隔之資料集類別的專案名稱,即可達到上述目的。
若要將資料集和 TableAdapter 分開
按兩下 [方案總管] 中的 [NorthwindDataSet.xsd],在 [DataSet 設計工具] 中開啟資料集。
按一下設計工具中的空白區域。
找出 [屬性] 視窗中的 [DataSet 專案] 節點。
按一下 [資料集專案] 清單中的 [DataEntityTier]。
在 [建置] 功能表上,按一下 [建置方案]。
資料集和 TableAdapter 便會分開成為兩個類別庫專案。原來包含整個資料集 (DataAccessTier) 的專案,現在只包含 TableAdapter。[資料集專案] 屬性 (DataEntityTier) 中指定的專案包含具型別資料集:NorthwindDataSet.Dataset.Designer.vb (或 NorthwindDataSet.Dataset.Designer.cs)。
注意事項: |
---|
當您藉由設定 [資料集專案] 屬性分隔 TableAdapter 和資料集時,專案中現有的部分資料集類別不會自動移動。您必須將現有的資料集部分類別手動移至資料集專案。 |
建立新的服務應用程式
由於本逐步解說會示範如何使用 WCF 服務存取資料存取層,因此請建立新的 WCF 服務應用程式。
若要建立新的 WCF 服務應用程式
在 [檔案] 功能表中,將新專案加入至 NTierWalkthrough 方案。
在 [新增專案] 對話方塊的 [專案類型] 窗格中,按一下 [WCF]。按一下 [範本] 窗格中的 [WCF 服務庫]。
將專案命名為 DataService,然後按一下 [確定]。
DataService 專案隨即建立並加入至 NTierWalkthrough 方案。
在資料存取層中建立方法以傳回 Customers 和 Orders 資料
資料服務必須呼叫資料存取層中的兩個方法:GetCustomers 和 GetOrders。這些方法將傳回 Northwind Customers 和 Orders 資料表。在 DataAccessTier 專案中建立 GetCustomers 和 GetOrders 方法。
若要在資料存取層中建立會傳回 Customers 資料表的方法
按兩下 [方案總管] 中的 NorthwindDataset.xsd,以 DataSet 設計工具開啟該資料集。
以滑鼠右鍵按一下 [CustomersTableAdapter],然後按一下 [加入查詢] 開啟 TableAdapter 查詢組態精靈。
在 [選擇命令類型] 頁面上,保留預設值 [使用 SQL 陳述式],然後按 [下一步]。
在 [選擇查詢類型] 頁面上,保留預設值 [傳回資料列的 SELECT],然後按 [下一步]。
在 [指定 SQL SELECT 陳述式] 頁面上保留預設查詢,然後按 [下一步]。
在 [選擇要產生的方法] 頁面之 [傳回 DataTable] 區段的 [方法名稱] 中輸入 GetCustomers。
按一下 [完成]。
若要在資料存取層中建立會傳回 Orders 資料表的方法
以滑鼠右鍵按一下 [OrdersTableAdapter],然後按一下 [加入查詢]。
在 [選擇命令類型] 頁面上,保留預設值 [使用 SQL 陳述式],然後按 [下一步]。
在 [選擇查詢類型] 頁面上,保留預設值 [傳回資料列的 SELECT],然後按 [下一步]。
在 [指定 SQL SELECT 陳述式] 頁面上保留預設查詢,然後按 [下一步]。
在 [選擇要產生的方法] 頁面之 [傳回 DataTable] 區段的 [方法名稱] 中輸入 GetOrders。
按一下 [完成]。
在 [建置] 功能表上,按一下 [建置方案]
將資料實體和資料存取層的參考加入至資料服務
由於資料服務會需要資料集和 TableAdapter 的資料,因此請加入 DataEntityTier 和 DataAccessTier 專案的參考。
若要將參考加入至資料服務
以滑鼠右鍵按一下 [方案總管] 中的 [DataService],然後按一下 [加入參考]。
按一下 [加入參考] 對話方塊中的 [專案] 索引標籤。
選取 [DataAccessTier] 和 [DataEntityTier] 專案。
按一下 [確定]。
將函式加入至服務以呼叫資料存取層中的 GetCustomers 和 GetOrders 方法
現在資料存取層已包含可傳回資料的方法,請接著在資料服務中建立方法以呼叫資料存取層中的方法。
注意事項: |
---|
若為 C# 專案,您必須加入 System.Data.DataSetExtensions 組件的參考,才能編譯下列程式碼。 |
若要在資料服務中建立 GetCustomers 和 GetOrders 函式
在 [DataService] 專案中,按兩下 [IService1.vb] 或 [IService1.cs]。
在 [在此加入您的服務作業] 註解中加入下列程式碼:
<OperationContract()> _ Function GetCustomers() As DataEntityTier.NorthwindDataSet.CustomersDataTable <OperationContract()> _ Function GetOrders() As DataEntityTier.NorthwindDataSet.OrdersDataTable
[OperationContract] DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers(); [OperationContract] DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders();
在 [DataService] 專案中,按兩下 [Service1.vb] (或 [Service1.cs])。
將下列程式碼加入至 Service1 類別:
Public Function GetCustomers() As DataEntityTier.NorthwindDataSet.CustomersDataTable Implements IService1.GetCustomers Dim CustomersTableAdapter1 As New DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter Return CustomersTableAdapter1.GetCustomers() End Function Public Function GetOrders() As DataEntityTier.NorthwindDataSet.OrdersDataTable Implements IService1.GetOrders Dim OrdersTableAdapter1 As New DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter Return OrdersTableAdapter1.GetOrders() End Function
public DataEntityTier.NorthwindDataSet.CustomersDataTable GetCustomers() { DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter CustomersTableAdapter1 = new DataAccessTier.NorthwindDataSetTableAdapters.CustomersTableAdapter(); return CustomersTableAdapter1.GetCustomers(); } public DataEntityTier.NorthwindDataSet.OrdersDataTable GetOrders() { DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter OrdersTableAdapter1 = new DataAccessTier.NorthwindDataSetTableAdapters.OrdersTableAdapter(); return OrdersTableAdapter1.GetOrders(); }
在 [建置] 功能表上,按一下 [建置方案]
建立展示層以顯示資料服務的資料
現在方案包含的資料服務具有可呼叫資料存取層的方法,請接著建立其他將呼叫資料服務,並可對使用者呈現資料的專案。針對本逐步解說,請建立 Windows Form 應用程式。這就是 N-Tier 應用程式的展示層。
若要建立展示層專案
在 [檔案] 功能表中,將新專案加入至 NTierWalkthrough 方案。
在 [新增專案] 對話方塊的 [專案類型] 窗格中,按一下 [Windows]。按一下 [範本] 窗格中的 [Windows Form 應用程式]。
將專案命名為 PresentationTier,然後按一下 [確定]。
PresentationTier 專案隨即建立並加入至 NTierWalkthrough 方案。
將 PresentationTier 專案設定為啟始專案
由於展示層是用於呈現資料並與資料互動的實際用戶端應用程式,因此您必須將 PresentationTier 專案設定為啟始專案。
若要將新的展示層專案設定為啟始專案
- 以滑鼠右鍵按一下 [方案總管] 中的 [PresentationTier],然後按一下 [設定為啟始專案]。
將參考加入至展示層
用戶端應用程式 PresentationTier 需要資料服務的服務參考,才能存取服務中的方法。此外,啟用 WCF 服務的型別共用時也需要資料集的參考。在您透過資料服務啟用型別共用之前,展示層將無法使用加入至部分資料集類別的程式碼。由於您通常會將驗證這類程式碼加入至資料表的資料列和資料行變更事件,因此您很可能想從用戶端存取此程式碼。如需詳細資訊,請參閱使用 Visual Studio 中的 WCF 服務。
若要將參考加入至展示層
以滑鼠右鍵按一下 [方案總管] 中的 [PresentationTier],然後按一下 [加入參考]。
在 [加入參考] 對話方塊中按一下 [專案] 索引標籤。
選取 [DataEntityTier],然後按一下 [確定]。
若要將服務參考加入至展示層
以滑鼠右鍵按一下 [方案總管] 中的 [PresentationTier],然後按一下 [加入服務參考]。
在 [加入服務參考] 對話方塊中,按一下 [探索]。
選取 [Service1],然後按一下 [確定]。
注意事項: 如果您在目前的電腦上擁有多個服務,請選取先前在本逐步解說中建立的服務 (包含 GetCustomers 和 GetOrders 方法的服務)。
將 DataGridViews 加入至表單以顯示資料服務傳回的資料
將服務參考加入至資料服務之後,[資料來源] 視窗會自動填入服務所傳回的資料。
若要將兩個資料繫結 DataGridViews 加入至表單
在 [方案總管] 中,選取 [PresentationTier] 專案。
展開 [資料來源] 視窗中的 [NorthwindDataSet],然後找出 [Customers] 節點。
將 [Customers] 節點拖曳至 [Form1]。
展開 [資料來源] 視窗中的 [Customers] 節點,然後找出相關的 [Orders] 節點 ([Orders] 節點會在 [Customers] 中以巢狀顯示)。
將相關的 [Orders] 節點拖曳至 [Form1]。
按兩下表單的空白區域,即可建立 Form1_Load 事件處理常式。
將下列程式碼加入至 Form1_Load 事件處理常式。
Dim DataSvc As New ServiceReference1.Service1Client NorthwindDataSet.Customers.Merge(DataSvc.GetCustomers) NorthwindDataSet.Orders.Merge(DataSvc.GetOrders)
ServiceReference1.Service1Client DataSvc = new ServiceReference1.Service1Client(); northwindDataSet.Customers.Merge(DataSvc.GetCustomers()); northwindDataSet.Orders.Merge(DataSvc.GetOrders());
增加服務允許的訊息大小上限
由於服務會從 Customers 和 Orders 資料表傳回資料,因此 maxReceivedMessageSize 的預設值不足以保留資料,您必須增加其大小。針對此逐步解說,請將該值變更為 6553600。您將對用戶端變更該值,這麼做便會自動更新服務參考。
注意事項: |
---|
使用較低的預設大小可降低阻絕服務 (DoS) 攻擊的可能性。如需詳細資訊,請參閱 MaxReceivedMessageSize。 |
若要增加 maxReceivedMessageSize 值
在 [方案總管] 中,按兩下 [PresentationTier] 專案中的 [app.config] 檔案。
找出 [maxReceivedMessage] 大小屬性,並將其值變更為 6553600。
測試應用程式
執行應用程式。隨即從資料服務擷取資料,並顯示在表單中。
若要測試應用程式
按下 F5 鍵。
隨即從資料服務擷取 Customers 和 Orders 資料表的資料,並顯示在表單中。
後續步驟
視應用程式的需求而定,在您儲存 Windows 應用程式中的關聯資料後,可能還要執行幾個步驟。例如,您可以進行下列作業讓這個應用程式發揮更強的功能:
將驗證加入至資料集。如需詳細資訊,請參閱 逐步解說:將驗證加入至 N-Tier 資料應用程式。
將本機資料庫加入至應用程式。如需詳細資訊,請參閱逐步解說:將本機資料庫快取加入至 N-Tier 應用程式。
將其他方法加入至服務,以更新資料庫內的資料。