新思维,Attribute-Cener Designing (Framework的设计与应用 学习笔记)

本节中用Attribute技术实现一个简单的ORM,什么是ORM呢?就是将数据表对应成对象。
本节采用Record Mapping的方式。

1:创建record对象

 1using System;
 2using System.System.componentModel;
 3using PowerORM;
 4
 5namesapce WindowsApplication5
 6{
 7    public class Customer
 8    {
 9        private string _customerID,_companyName,_contactName;
10        public string CustomerID
11        {
12            get
13            {
14                return _customerID;
15            }

16            set
17            {
18                _customerID=value;
19            }

20        }

21        
22        public string CompanyName
23        {
24            get
25            {
26                return _companyName;
27            }

28            set
29            {
30                _companyName=value;
31            }

32        }

33        
34        public string ContactName
35        {
36            get
37            {
38                return _contactName;
39            }

40            set
41            {
42                _contactName=value;
43            }

44        }

45        
46        public Customer()
47        }

48    }

49}
50

现在假设已由数据库读出一条数据,如何将数据填入到这个对象中呢?两个方法(1),用Reflection技术枚举对象中的属性,再以属性名为一句取得同名字段,填入数据,有个缺点,属性名受到字段名限制。
(2) 使用Attribute为属性贴上一个标签,下面就是这个“标签” 的代码:
 1using System;
 2using System.Component;
 3namespace PowerORM
 4{
 5    [AttributeUsage(AttributeTargets.Property,Inherited=false,allowMultiple=false)]
 6    
 7    public class ColumnAttribute:Attribute
 8    {
 9        private string _columnName=null;
10            
11        public string ColumnName
12        {
13            get
14            {
15                return _columnName;
16            }

17        }

18        
19        public ColumnAttribute(string columnName)
20        {
21            _columnName=columnName;
22        }

23    }

24}


有了ColumnAttribute之后,用户可以在属性上贴一个标签,代表该属性所对应的字段

如:

[Column("CompnayName")]
public string  CompanyName

最后撰写Fill数据的Helper对象,此对象将会依据对象中的Attribue设置来填充数据。

 1using system;
 2using System.Collections;
 3using System.ComponentModel;
 4using System.Refection;
 5using System.Data;
 6using System.Data.Common;
 7
 8namespace PowerORM
 9{
10    public sealed class  FillHelper
11    {
12        //两个参数是代表一行数据的类、数据记录
13        public static IList Fill(Type rowType, IDataReader reader)
14            
15        {
16            ArrarList  dataList=new ArraryList();
17            
18            while(reader.Read()) //对每行数据
19            {
20                object item=Activator.CreateInstance(rowType,false);
21                //使用activator.CreateInstance见了一个rowType类 ,第二个参数表示是否使用默认构造函数
22                
23                foreach(MemberInfo mi in rowType.GetMembers())
24                //获取“数据行类”的所有成员
25                {
26                    foreach(ColumnAttribute attr in Attribute.GetcustomAttributes(mi,typeOf(ColumnAttribute),false))
27                    //获取“数据行类”中“某成员”的所有自定义标签,本例子将只获取到一个
28                    {
29                        int index=reader.GetOrdinal(attr.ColumnName); //在“数据记录”中查找此“自定义标签”所代表的数据的序号
30                        
31                        if(index!=-1)
32                            //如果存在
33                        {
34                            if(mi.MemberType==MemberTypes.Field)  //如果此成员是"Field"类型
35                                ((FieldInfo)mi).SetValue(item,reader.GetValue(index));  //把 reader.GetValue(index)赋值给 “行数据对象 item"的 mi成员 ,mi为 Field类型
36                                else if(mi.MemberType==MemberTypes.Property)
37                                ((PropertyInfo)mi).SetValue(item,reader,GetValue(index),null); //基本同上
38                        }

39                    }

40                }

41                
42                dataList.Add(iem);
43            }

44            return dataList;
45        }

46        private FillHelper()
47        {
48        }

49    }

50}

51
52        
53                    
posted on 2008-01-05 10:02  蓝蓝的天2016  阅读(185)  评论(0)    收藏  举报