ObjectDataSource控件與SqlDataSource控件的對象模型是類似的。ObjectDataSource沒有ConnectionString屬性,它暴露了TypeName屬性,用於指定需要實例化的執行數據操作的對象類型(類名)。ObjectDataSource控件與SqlDataSource的命令屬性相似,也支持SelectMethod、UpdateMethod、InsertMethod和DeleteMethod等屬性,用於指明執行這些數據操作的關聯類型的方法。本文將解釋建立數據訪問層和業務邏輯層組件,並通過ObjectDataSource對象展示ASP.NET 2.0數據組件的技術。
綁定到數據訪問層
數據訪問層組件封裝了那些使用SQL命令查詢和修改數據庫的ADO.NET代碼。在典型情況下,它抽象了建立ADO.NET連接和命令的細節信息,暴露了可以通過適當參數調用的方法。典型的數據訪問層組件可能暴露了下面一些方法:
public class MyDataLayer {
public DataView GetRecords();
public DataView GetRecordsByCategory(String categoryName);
public DataView GetRecordByID(int recordID);
public int UpdateRecord(int recordID, String recordData);
public int DeleteRecord(int recordID);
public int InsertRecord(int recordID, String recordData);
}
ObjectDataSource可以使用下面的方式來關聯到這個類型:
<asp:ObjectDataSource TypeName="MyDataLayer" SelectMethod="GetRecords" UpdateMethod="UpdateRecord"
DeleteMethod="DeleteRecord" InsertMethod="InsertRecord" runat="server"/>
ObjectDataSource要求對象有非常特殊的設計模式。這些約束都是Web應用程序請求所處的無狀態的(stateless)環境引起的。由於在典型情況下,對象的建立和銷毀都是為了服務於一個請求,因此通過對象數據源綁定的對象也是無狀態的。在默認情況下,ObjectDataSource采用TypeName屬性指定的類型的默認的構造函數(不帶參數),盡管通過處理ObjectCreating事件來建立一個自定義對象實例,並把它指定給事件參數的ObjectInstance屬性,從而實現實例化也是可行的。與SelectMethod屬性關聯的對象方法可以返回任何對象、Ienumerable列表、集合或數組。在上面的數據訪問層示例中,DataView對象實現了IEnumerable接口。我們在下一部分將討論到,這些方法也可以返回強化類型的集合或對象。
GetProducts() -> ProductCollection
GetProductsDataSet() -> DataSet
GetProduct (int productId) -> Product
Update、Insert和Delete一般把單獨的數據項字段作為參數,也可以把帶有數據項字段公共屬性的集合類對象作為參數。
UpdateProduct (int id, String name, double price, bool inStock)
UpdateProduct (Product p) // p.ID, p.Name, p.Price, p.InStock
DeleteProduct (int id)