適用於
Microsoft®
NET 應用程序
摘要
學習向 Microsoft
NET 應用程序公開數據的最佳方式
以及如何實現一個有效的策略以便在分布式應用程序的層間傳遞數據
(本文包含一些指向英文站點的鏈接
)
目錄
簡介
將關系數據映射到業務實體
實現數據訪問邏輯組件
實現業務實體
事務處理
驗證
異常管理
授權與安全性
部署
附錄
合作者
簡介
在設計分布式應用程序時需要確定如何訪問和表示與該應用程序相關聯的業務數據
本文提供一些指導原則以幫助您選擇公開數據
保持數據和在應用程序的層間傳遞數據的最佳方式
圖
所示為分布式應用程序中的常見層
本文區分業務數據與使用這些數據的業務過程
並且僅在需要明確說明時討論業務過程層
同樣
本文僅在直接涉及數據表示方式(例如 Microsoft® ASP
NET Web 頁面公開業務數據的方式)時討論表示層
圖
中使用了兩個新術語
數據訪問邏輯組件和業務實體組件
本文後面將解釋這些術語
圖
分布式應用程序中數據的訪問與表示
多數應用程序將數據存儲在關系數據庫中
除此之外還有其他數據存儲方式
但本文重點討論
NET 應用程序與關系數據庫交互的方式
而並不專門討論它如何與平面文件
非關系數據庫等其他數據存儲中的數據進行交互
本文明確區分保持邏輯與數據本身
將保持邏輯與數據區分開來的原因如下
獨立的數據保持組件可以將應用程序與數據源名稱
連接信息
字段名等數據庫相關內容隔離開
現在的許多應用程序都采用 XML Web services
Microsoft 消息隊列(亦稱 MSMQ)等松散耦合的
基於消息的技術
這些應用程序通常通過傳遞業務文檔而不是傳遞對象進行通信
為區分保持邏輯與數據本身
本文提出了兩種不同的組件類型
數據訪問邏輯組件
數據訪問邏輯組件從數據庫中檢索數據並把實體數據保存回數據庫中
數據訪問邏輯組件還包含實現數據相關操作所需的所有業務邏輯
業務實體組件
數據用來表示產品
訂單等現實世界中的業務實體
在應用程序中表示這種業務實體的方法非常多
例如 XML
DataSet
面向對象的自定義類等
這取決於應用程序的物理和邏輯設計限制
本文後面將詳細討論各種設計方案
數據訪問邏輯組件
數據訪問邏輯組件代表調用程序提供對數據庫執行以下任務的方法
在數據庫中創建記錄
讀取數據庫中的記錄並把業務實體數據返回給調用程序
使用調用程序提供的修改後的業務實體數據更新數據庫中的記錄
刪除數據庫中的記錄
執行上述任務的方法通常稱為
CRUD
方法
這是由各項任務的首字母組成的一個縮寫詞
數據訪問邏輯組件還提供對數據庫實現業務邏輯的方法
例如
數據訪問邏輯組件可能包含一個查找目錄中本月銷售額最高的產品的方法
通常
數據訪問邏輯組件訪問一個單一數據庫
並封裝了針對該數據庫中一個表或一組相關表的數據相關操作
例如
可以定義一個數據訪問邏輯組件來處理數據庫中的 Customer 表和 Address 表
同時定義另一個數據訪問邏輯組件來處理 Orders 表和 OrderDetails 表
本文後面將討論將數據訪問邏輯組件映射到數據庫表的設計決策
表示業務實體
每個數據訪問邏輯組件都處理一種特定類型的業務實體
例如
Customer 數據訪問邏輯組件處理 Customer 業務實體
表示業務實體的方式很多
這取決於諸如以下因素
是否需要把業務實體數據與 Microsoft Windows® 窗體或 ASP
NET 頁面中的控件綁定在一起?
是否需要對業務實體數據執行排序或搜索操作?
應用程序是每次處理一個業務實體
還是通常處理一組業務實體?
是本地部署還是遠程部署應用程序?
XML Web services 是否使用該業務實體?
性能
可縮放性
可維護性
編程方便性等非功能性要求的重要程度如何?
本文將概述以下實現選項的優缺點
XML
使用 XML 字符串或 XML 文檔對象模型 (DOM) 對象來表示業務實體數據
XML 是一種開放而靈活的數據表示格式
可用於集成各種類型的應用程序
DataSet
DataSet 是緩存在內存中的表
它是從關系數據庫或 XML 文檔中獲得的
數據訪問邏輯組件可以使用 DataSet 來表示從數據庫中檢索到的業務實體數據
您可以在應用程序中使用該 DataSet
有類型的 DataSet
有類型的 DataSet 是從 ADO
NET DataSet 類繼承而來的類
它為訪問表和 DataSet 中的列提供了具有嚴格類型的方法
事件和屬性
業務實體組件
這是一種自定義類
用於表示各種業務實體類型
您可以定義保存業務實體數據的字段
並定義將此數據向客戶端應用程序公開的屬性
然後使用在該類中定義的字段來定義方法以封裝簡單的業務邏輯
此選項並不通過 CRUD 方法實現與基礎數據訪問邏輯組件的數據傳遞
而是通過客戶端應用程序直接與數據訪問邏輯組件進行通信以執行 CRUD 操作
帶有 CRUD 行為的業務實體組件
按上述方法定義一個自定義實體類
並實現調用與此業務實體相關聯的基礎數據訪問邏輯組件的 CRUD 方法
注意
如果希望以一種更加面向對象的方式使用數據
可以使用另一種替代方法
即定義一個基於公共語言運行庫的反射功能的對象保持層
您可以創建一個使用反射功能來讀取對象屬性的架構
並使用映射文件來描述對象與表之間的映射
然而
要有效地實現上述方法
需要大量的基礎結構代碼投入
對於 ISV 和解決方案提供商來說
這種投入或許可以接受
但對於大多數組織則不可行
有關這方面的討論超出了本文的范圍
這裡不再論述
技術因素
圖
所示為影響數據訪問邏輯組件和業務實體實現策略的一些技術因素
本文將分別討論這些技術因素並提供相關建議
圖
影響數據訪問邏輯組件和業務實體設計的技術因素
將關系數據映射到業務實體
數據庫通常包含許多表
這些表之間的關系通過主鍵和外鍵來實現
當定義業務實體以在
NET 應用程序中表示這些數據時
必須確定如何把這些表映射到業務實體
請考慮圖
所示的假想零售商數據庫
圖
假想的關系數據庫中的表關系
下表總結了示例數據庫中的關系類型
當定義業務實體以在數據庫中建立信息模型時
應考慮要如何在您的應用程序中使用這些信息
應當標識封裝您的應用程序的功能的核心業務實體
而不是為每個表定義單獨的業務實體
該假想零售商的應用程序中的典型操作如下
獲取(或更新)客戶的有關信息(包括地址)
獲取客戶的訂單列表
獲取特定訂單的訂購項目列表
創建新訂單
獲取(或更新)一個或一組產品的有關信息
為滿足這些應用程序要求
該應用程序要處理三個邏輯業務實體
Customer
Order 和 Product
對於每個業務實體
都將定義一個單獨的數據訪問邏輯組件
如下所示
Customer 數據訪問邏輯組件
此類將為檢索和修改 Customer 表和 Address 表中的數據提供服務
Order 數據訪問邏輯組件
此類將為檢索和修改 Order 表和 OrderDetails 表中的數據提供服務
Product 數據訪問邏輯組件
此類將為檢索和修改 Product 表中的數據提供服務
圖
所示為這些數據訪問邏輯組件與它們所表示的數據庫中的表之間的關系
圖
定義向
NET 應用程序公開關系數據的數據訪問邏輯組件
有關如何實現數據訪問邏輯組件的說明
請參閱本文後面的實現數據訪問邏輯組件
將關系數據映射到業務實體的建議
要將關系數據映射到業務實體
請考慮以下建議
花些時間來分析您的應用程序的邏輯業務實體並為之建立模型
不要為每個表定義一個單獨的業務實體
建立應用程序的工作方式模型的方法之一是使用統一建模語言 (UML)
UML 是一種形式設計注釋
用於在面向對象的應用程序中建立對象模型
並獲取有關對象如何表示自動過程
人機交互以及關聯的信息
不要定義單獨的業務實體來表示數據庫中的多對多表
可以通過在數據訪問邏輯組件中實現的方法來公開這些關系
例如
前面示例中的 OrderDetails 表沒有映射到單獨的業務實體
而是通過在 Order 數據訪問邏輯組件中封裝 OrderDetails 表來實現 Order 與 Product 表之間的多對多關系
如果具有返回特定業務實體類型的方法
請把這些方法放在該類型對應的數據訪問邏輯組件中
例如
當檢索一個客戶的全部訂單時
返回值為 Order 類型
因此應在 Order 數據訪問邏輯組件中實現該功能
反之
當檢索訂購某特定產品的全部客戶時
應在 Customer 數據訪問邏輯組件中實現該功能
數據訪問邏輯組件通常訪問來自單一數據源的數據
當需要聚合多個數據源的數據時
建議分別為訪問每個數據源定義一個數據訪問邏輯組件
這些組件可以由一個能夠執行聚合任務的更高級業務過程組件來調用
建議采用這種方法的原因有二
事務管理集中在業務過程組件中
不需要由數據訪問邏輯組件顯式控制
如果通過一個數據訪問邏輯組件訪問多個
From:http://tw.wingwit.com/Article/os/xtgl/201311/9238.html