代码改变世界

ORM映射框架总结--数据操作(四)

2010-01-02 12:11  贺臣  阅读(1408)  评论(0编辑  收藏  举报

 

1.BaseEntityHelper 解析实体类特性

代码
  1 /**
  2  * 
  3  * 2009-4-17
  4  * 
  5  * 
  6  * 字段的特性
  7  * */
  8 using System;
  9 using System.Collections.Generic;
 10 using System.Linq;
 11 using System.Text;
 12 using System.Reflection;
 13 using CommonData.Model;
 14 
 15 namespace CommonData.Data
 16 {
 17     public abstract class BaseEntityHelper
 18     {
 19         /// <summary>
 20         /// 根据反射类型获得相应实体的特性
 21         /// </summary>
 22         /// <param name="type">实体类型</param>
 23         /// <returns></returns>
 24         public TableInfo GetTableInfo(Type type)
 25         {
 26             TableInfo info = EntityTypeCache.Get(type);
 27             if (info == null)
 28             {
 29                 //获得表类型的特性集合
 30                 TableAttribute[] tableAttribute = type.GetCustomAttributes(typeof(TableAttribute),falseas TableAttribute[];
 31                 //获得列类型的特性集合
 32                 List<ColumnAttribute> listColumnAttribute = new List<ColumnAttribute>();
 33                 //获得主表类型的特性集合
 34                 List<LinkTableAttribute> listLinkTableAttribute = new List<LinkTableAttribute>();
 35                 //获得子表类型的特性集合
 36                 List<LinkTablesAttribute> listLinktablesAttribute = new List<LinkTablesAttribute>();
 37                 
 38                 //获得该类型实体的所有属性
 39                 PropertyInfo[] propertyInfo = type.GetProperties();
 40 
 41                 foreach (PropertyInfo property in propertyInfo)
 42                 {
 43                     //ColumnAttribute[] columnAttribute = property.GetCustomAttributes(typeof(ColumnAttribute), false) as ColumnAttribute[];
 44                     //LinkTableAttribute[] linkTableAttribute = property.GetCustomAttributes(typeof(LinkTableAttribute),false) as LinkTableAttribute[];
 45                     //LinkTablesAttribute[] linkTablesAttribute = property.GetCustomAttributes(typeof(LinkTablesAttribute), false) as LinkTablesAttribute[];
 46 
 47                     //if (columnAttribute.Length > 0)
 48                     //{
 49                     //    listColumnAttribute.Add(columnAttribute[0]);
 50                     //}
 51                     //if (linkTableAttribute.Length > 0)
 52                     //{
 53                     //    listLinkTableAttribute.Add(listLinkTableAttribute[0]);
 54                     //}
 55                     //if (linkTablesAttribute.Length > 0)
 56                     //{
 57                     //    listLinktablesAttribute.Add(linkTablesAttribute[0]);
 58                     //}
 59                     if (property.GetCustomAttributes(typeof(ColumnAttribute), false).Length > 0)
 60                     {
 61                         listColumnAttribute.Add(property.GetCustomAttributes(typeof(ColumnAttribute),false)[0as ColumnAttribute);
 62                     }
 63                     if (property.GetCustomAttributes(typeof(LinkTableAttribute), false).Length > 0)
 64                     {
 65                         listLinkTableAttribute.Add(property.GetCustomAttributes(typeof(LinkTableAttribute),false)[0as LinkTableAttribute);
 66                     }
 67                     if (property.GetCustomAttributes(typeof(LinkTablesAttribute), false).Length > 0)
 68                     {
 69                         listLinktablesAttribute.Add(property.GetCustomAttributes(typeof(LinkTablesAttribute),false)[0as LinkTablesAttribute);
 70                     }
 71                 }
 72 
 73                 info = new TableInfo();
 74                 info.Table = tableAttribute[0];
 75                 info.Columns = listColumnAttribute.ToArray();
 76                 info.LinkTable = listLinkTableAttribute.ToArray();
 77                 info.LinkTables = listLinktablesAttribute.ToArray();
 78                 info.Properties = propertyInfo;
 79                 EntityTypeCache.InsertTableInfo(type,info);
 80             }
 81             return info;
 82         }
 83 
 84 
 85         /// <summary>
 86         /// 根据实体公共父接口获得特性信息
 87         /// </summary>
 88         /// <param name="entity">公共接口对象</param>
 89         /// <returns></returns>
 90         public TableInfo GetTableInfo(IEntity entity)
 91         {
 92             return GetTableInfo(entity.GetType());
 93         }
 94 
 95         /// <summary>
 96         /// 根据实体类型获得表的特性信息
 97         /// </summary>
 98         /// <returns></returns>
 99         public TableInfo GetTableInfo<T>()
100         {
101             Type type=typeof(T);
102             return GetTableInfo(type);
103         }
104 
105         /// <summary>
106         /// 更具实体公共接口获得列类型特新信息
107         /// </summary>
108         /// <param name="entity">公共实体接口</param>
109         /// <returns></returns>
110         public ColumnAttribute[] GetColumnAttribute(IEntity entity)
111         {
112             return GetTableInfo(entity).Columns;
113         }
114 
115         /// <summary>
116         /// 更具实体类型获得列类特性信息
117         /// </summary>
118         /// <param name="type">实体类类型</param>
119         /// <returns></returns>
120         public ColumnAttribute[] GetColumnAttribute(Type type)
121         {
122             return GetTableInfo(type).Columns;
123         }
124 
125         /// <summary>
126         /// 更具泛型类型获得列类型特性信息
127         /// </summary>
128         /// <typeparam name="T">泛型类型</typeparam>
129         /// <returns></returns>
130         public ColumnAttribute[] GetColumnAttribute<T>()
131         {
132             return GetTableInfo<T>().Columns;
133         }
134 
135         /// <summary>
136         /// 更具实体公共接口获得主表类型特性信息
137         /// </summary>
138         /// <param name="entity">公共实体接口</param>
139         /// <returns></returns>
140         public LinkTableAttribute[] GetLinkTableAttribute(IEntity entity)
141         {
142             return GetTableInfo(entity).LinkTable;
143         }
144 
145         /// <summary>
146         /// 更具实体类型获得主表特性信息
147         /// </summary>
148         /// <param name="type">实体类型</param>
149         /// <returns></returns>
150         public LinkTableAttribute[] GetLinkTableAttribute(Type type)
151         {
152             return GetTableInfo(type).LinkTable;
153         }
154 
155         /// <summary>
156         /// 更具泛型类型获得主表类型特性信息
157         /// </summary>
158         /// <typeparam name="T">泛型类型</typeparam>
159         /// <returns></returns>
160         public LinkTableAttribute[] GetLinkTableAttribute<T>()
161         {
162             return GetTableInfo<T>().LinkTable;
163         }
164 
165         /// <summary>
166         /// 更具实体公共接口来获得子表类型特性信息
167         /// </summary>
168         /// <param name="entity">公共接口</param>
169         /// <returns></returns>
170         public LinkTablesAttribute[] GetLinkTablesAttribute(IEntity entity)
171         {
172             return GetTableInfo(entity).LinkTables;
173         }
174 
175 
176         /// <summary>
177         /// 更具实体类型获得子表类型特性信息
178         /// </summary>
179         /// <param name="type">实体类型</param>
180         /// <returns></returns>
181         public LinkTablesAttribute[] GetLinkTablesAttribute(Type type)
182         {
183             return GetTableInfo(type).LinkTables;
184         }
185 
186         /// <summary>
187         /// 更具泛型获得子表类型特性信息
188         /// </summary>
189         /// <typeparam name="T">泛型类型</typeparam>
190         /// <returns></returns>
191         public LinkTablesAttribute[] GetLinkTablesAttribute<T>()
192         {
193             return GetTableInfo<T>().LinkTables;
194         }
195 
196         /// <summary>
197         /// 根据共同实体接口获得表特性信息
198         /// </summary>
199         /// <param name="entity">公共实体接口</param>
200         /// <returns></returns>
201         public TableAttribute GetTableAttribute(IEntity entity)
202         {
203             return GetTableInfo(entity).Table;
204         }
205 
206         /// <summary>
207         /// 根据实体类型获得实体特性信息
208         /// </summary>
209         /// <param name="type">实体类型</param>
210         /// <returns></returns>
211         public TableAttribute GetTableAttribute(Type type)
212         {
213             return GetTableInfo(type).Table;
214         }
215 
216         /// <summary>
217         /// 根据泛型类型获得实体特性信息
218         /// </summary>
219         /// <typeparam name="T">泛型类型</typeparam>
220         /// <returns></returns>
221         public TableAttribute GetTableAttribute<T>()
222         {
223             return GetTableInfo<T>().Table;
224         }
225 
226     }
227 }
228 

 

  BaseEntityHelper 这个类主要是为了解析实体类的特性信息。 public TableInfo GetTableInfo(Type type) 这个方法这个类中的核心,我们从Type 类型可以获得该类型的所有属性,方法和特性信息,同时我们也可以动态的从这个实体类中获得属性的值或者为这个属性赋值。反射可以保证我们在不知道实体相关信息的情况下获得实体的数据信息。这也是后面再组装sql语句赋值的核心

  同时这个类中大量重载了一小儿方法,包括泛型的重载方法。目的是为了体现程序的灵活性。

 

2.拓展类 DataExtension

代码
 1 /**
 2  * 
 3  * 2009-4-17
 4  * 
 5  * 
 6  * 拓展方法,用于添加参数
 7  * */
 8 using System;
 9 using System.Collections.Generic;
10 using System.Linq;
11 using System.Text;
12 using System.Data;
13 
14 namespace CommonData.Data
15 {
16     public static class DataExtension
17     {
18         /// <summary>
19         /// 拓展方法,用于给执行语句添加参数
20         /// </summary>
21         /// <param name="paramenters">参数集合列表</param>
22         /// <param name="param">传递的参数值集合</param>
23         public static void AddRange(this IDataParameterCollection paramenters, params IDataParameter[] param)
24         {
25             if (param != null)
26             {
27                 foreach (IDbDataParameter p in param)
28                 {
29                     paramenters.Add(p);
30                 }
31             }
32         }
33     }
34 }
35 

 

  这个类拓展了一个借口IDataParameterCollection,.net 中的拓展方法可以说为.net 平台注入了新的血液,让程序更加生动和富有色彩。扩展方法不仅可以或者自己定义的类中的方法,而且可以更具需要扩展系统中的方法。其中这个类中的AddRange 方法是一个很好的例子,扩展了IDataParamterCollection 这个接口中的方法。扩展这份方法可以将占位符中的变量一次性赋值,而不用每次都去循环赋值。

  其实SqlParamters 这个类中是有AddRange 这个方法的,可以一次为占位符添加数组和集合,但是现在这个是它的父接口,没有提供这样的方法,因此我们扩展了这个方法。还要说明的是 这里使用接口而没有直接使用SqlParameters 这个类是因为当程序需要扩展的时候,我们不局限于sql数据库(可能是Oracle 数据库),我们只需要实现相应的接口即可,实现的过程可以任意调整,这样程序才具有灵活性。本人写的这个只是实现了sql server 数据


作者:情缘
出处:http://www.cnblogs.com/qingyuan/
关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
联系方式: 个人QQ  821865130 ; 仓储技术QQ群 88718955,142050808 ;
吉特仓储管理系统 开源地址: https://github.com/hechenqingyuan/gitwms