用CollectionBase实现自定义实体对象

 实体层可以有多种选择,今天我谈谈用.Net 的CollectionBase 类建立实体层。
      源码
     .Net中可绑定的对象必须实现 ICollection, IEnumerable接口,CollectionBase则是很好的选择,查看它的定义可知其实现了上述两接口。
1.建立一个与Products表对应的类Product(为了适应多数读者,仍用.Net2的风格,.Net3.5会更简洁):
 1 namespace  CollBase
 2 {
 3[Serializable]
 4public class Product
 5{
 6private int _productId;
 7private string _productName;
 8private int _supplierId;
 9private int _categoryId;
10private string _quantityPerUnit;
11private float _unitPrice;
12private int _unitsInStock;
13private int _unitsOnOrder;
14private int _reorderLevel;
15private byte _discontinued;
16
17[XmlAttribute]
18public int ProductId
19{
20get return _productId; }
21set { _productId = value; }
22}

23
24[XmlAttribute]
25public string ProductName
26{
27get return _productName; }
28set { _productName = value; }
29}

30
31[XmlAttribute]
32public int SupplierId
33{
34get return _supplierId; }
35set { _supplierId = value; }
36}

37
38[XmlAttribute]
39public int CategoryId
40{
41get return _categoryId; }
42set { _categoryId = value; }
43}

44
45[XmlAttribute]
46public string QuantityPerUnit
47{
48get return _quantityPerUnit; }
49set { _quantityPerUnit = value; }
50}

51
52[XmlAttribute]
53public float UnitPrice
54{
55get return _unitPrice; }
56set { _unitPrice = value; }
57}

58
59[XmlAttribute]
60public int UnitInStock
61{
62get return _unitsInStock; }
63set { _unitsInStock = value; }
64}

65
66[XmlAttribute]
67public int UnitsOnOrder
68{
69get return _unitsOnOrder; }
70set { _unitsOnOrder = value; }
71}

72
73[XmlAttribute]
74public int ReorderLevel
75{
76get return _reorderLevel; }
77set { _reorderLevel = value; }
78}

79
80[XmlAttribute]
81public byte Discontinued
82{
83get return _discontinued; }
84set { _discontinued = value; }
85}

86
87}

88}

2.建立Product的集合类ProductCollection,此类继承自CollectionBase类:
 1 namespace  CollBase
 2 {
 3[Serializable]
 4public class ProductCollection:CollectionBase
 5{
 6public Product this[int index]
 7{
 8get return ((Product)List[index]); }
 9set { List[index] = value; }
10}

11
12public int Add(Product product)
13{
14return (List.Add(product));
15}

16
17public int IndexOf(Product product)
18{
19return (List.IndexOf(product));
20}

21
22}

23}

3.建立存储过程GetAllProduct,以XML格式返回Product表中全部记录:
 
Create   PROCEDURE   [ dbo ] . [ GetAllProduct ]

AS
BEGIN  
SET  NOCOUNT  ON ;
select
productid 
as   ' @ProductId ' ,
productName 
as   ' @ProductName ' ,
supplierid 
as   ' @SupplierId ' ,
categoryid 
as   ' @CategoryId ' ,
quantityperunit 
as   ' @QuantityPerUnit ' ,
unitprice 
as   ' @UnitPrice ' ,
unitsinstock 
as   ' @UnitInStock ' ,
unitsonorder 
as   ' @UnitsOnOrder ' ,
reorderlevel 
as   ' @ReorderLevel ' ,
discontinued 
as   ' @Discontinued '
from  products
for  xml path( ' Product ' ),root( ' ArrayOfProduct ' )
END

4.绑定数据
 1 private void BindGrid()
 2 {
 3 ProductCollection products  =  new ProductCollection();
 4 SqlDatabase db  =  new SqlDatabase(ConfigurationManager.ConnectionStrings [ "MySqlConnection" ] .ConnectionString);
 5 DbCommand command  =  db.GetStoredProcCommand("GetAllProduct");
 6 XmlReader reader  =  db.ExecuteXmlReader(command); 
 7 XmlSerializer serializer  =  new XmlSerializer(typeof(ProductCollection));
 8 products  =  (ProductCollection)serializer.Deserialize(reader);
 9
10 gridProduct.DataSource  =  products;
11 gridProduct.DataBind();
12
13 }

扩展:
1.本实例比较简单,我并没有作出分层,有兴趣的朋友可以自己试试。
2.对于实体类可以自己写个工具生成,而不必手写。
3.对于效率问题和Dataset,Linq相比,本人不敢妄言 ,此方法给大家多提供一种选择。
此例涉及到CollectionBase 的序列化和反序列化(CollectionBase的序列化有点特别)。写的比较仓促,有不明白之处回帖,我会尽快回复。如有不妥之处也请指教。

你可能感兴趣的:(Collection)