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)