代码改变世界

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

2010-01-01 10:53  贺臣  阅读(1583)  评论(2编辑  收藏  举报

 

1.TableInfo 封装实体特性类

代码
 1 /**
 2  * 
 3  * 2009-4-11
 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 
14 namespace CommonData.Model
15 {
16     public class TableInfo
17     {
18         private TableAttribute table;
19         /// <summary>
20         /// 表特性
21         /// </summary>
22         public TableAttribute Table
23         {
24             get { return table; }
25             set { table = value; }
26         }
27         private ColumnAttribute[] columns;
28         /// <summary>
29         /// 字段特性
30         /// </summary>
31         public ColumnAttribute[] Columns
32         {
33             get { return columns; }
34             set { columns = value; }
35         }
36         private FieldInfo[] fields;
37         /// <summary>
38         /// 字段特性
39         /// </summary>
40         public FieldInfo[] Fields
41         {
42             get { return fields; }
43             set { fields = value; }
44         }
45         private PropertyInfo[] properties;
46         /// <summary>
47         /// 属性特性
48         /// </summary>
49         public PropertyInfo[] Properties
50         {
51             get { return properties; }
52             set { properties = value; }
53         }
54         private LinkTableAttribute[] linkTable;
55         /// <summary>
56         /// 主表特性
57         /// </summary>
58         public LinkTableAttribute[] LinkTable
59         {
60             get { return linkTable; }
61             set { linkTable = value; }
62         }
63         private LinkTablesAttribute[] linkTables;
64         /// <summary>
65         /// 子表特性
66         /// </summary>
67         public LinkTablesAttribute[] LinkTables
68         {
69             get { return linkTables; }
70             set { linkTables = value; }
71         }
72     }
73 }

 

  该类封装每个实体类的特性信息,将每个类的实体特性封装为对象,在后面读取特性信息的时候就可以缓存该对象。每个实例对象对应一个实体类的所有特性信息。这里封装其实也对应了一张数据库表。

 

2.EntityTypeCache 读取实体特性信息

代码
  1 /**
  2  * 
  3  * 2009-4-11
  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 
 14 namespace CommonData.Model
 15 {
 16     public static class EntityTypeCache
 17     {
 18         private static Dictionary<Type, TableInfo> cache = null;
 19 
 20         /// <summary>
 21         /// 静态构造方法,确保该构造方法只执行一次,不会还原初始化值
 22         /// </summary>
 23         static EntityTypeCache()
 24         {
 25             cache = new Dictionary<Type, TableInfo>();
 26         }
 27 
 28         /// <summary>
 29         /// 更具type类型,将实体特性缓存
 30         /// </summary>
 31         /// <param name="type">实体类型</param>
 32         /// <param name="tableInfo">实体特性</param>
 33         public static void InsertTableInfo(Type type,TableInfo tableInfo)
 34         {
 35             if(cache.ContainsKey(type))
 36             {
 37                 return;
 38             }
 39             else
 40             {
 41                 cache.Add(type,tableInfo);
 42             }
 43         }
 44 
 45         /// <summary>
 46         /// 更具IEntity公共实体接口,将实体特性缓存
 47         /// </summary>
 48         /// <param name="entity">实体接口</param>
 49         /// <param name="tableInfo">实体特性</param>
 50         public static void InsertTableInfo(IEntity entity, TableInfo tableInfo)
 51         {
 52             Type type = entity.GetType();
 53             InsertTableInfo(type,tableInfo);
 54         }
 55 
 56         /// <summary>
 57         /// 更具实体类型获得特性信息
 58         /// </summary>
 59         /// <param name="type">实体类型</param>
 60         /// <returns></returns>
 61         public static TableInfo Get(Type type)
 62         {
 63             if (cache.ContainsKey(type))
 64             {
 65                 return cache[type];
 66             }
 67             else
 68             {
 69                 return null;
 70             }
 71         }
 72 
 73         /// <summary>
 74         /// 更具公共实体接口获得实体特性信息
 75         /// </summary>
 76         /// <param name="entity">公共实体接口</param>
 77         /// <returns></returns>
 78         public static TableInfo Get(IEntity entity)
 79         {
 80             Type type = entity.GetType();
 81             return Get(type);
 82         }
 83 
 84         /// <summary>
 85         /// 更具泛型类型获得实体特性信息
 86         /// </summary>
 87         /// <typeparam name="T">泛型类型</typeparam>
 88         /// <returns></returns>
 89         public static TableInfo Get<T>() where T:IEntity
 90         {
 91             Type type=typeof(T);
 92             if (cache.ContainsKey(type))
 93             {
 94                 return cache[type];
 95             }
 96             else
 97             {
 98                 return null;
 99             }
100         }
101     }
102 }

 

   这个类主要运用的知识是反射,都知道反射可以说是C#语言的灵魂(自我感觉),因为它可以获得数据的原始信息,在Java中的几个框架中都大量运用了反射。这个类都是采用的static 修饰符,静态类静态变量。第一,静态类是在程序域加载的时候加载的,第二 静态类可以全局共享。因此在这里以后读取这些信息的时候不用每次都去反射,第一次反射之后就缓存了这些数据,以后直接用就可以了。这是在性能方面的体现。这个类中还运用了一个IEntity 接口,这个接口是所有实体类的公共接口。在下面将讲解到这个类。使用接口的好处在这里也能体现出来,因为我还不知道实体类的属性有哪些,实体名称都不知道。接口给了一个抽象的概念

  这个类有三个地方值得注意:

  1. private static Dictionary<Type, TableInfo> cache = null; 使用字典类型数据存储,根据键值对存储数据时非常方面查找的。

  2.static EntityTypeCache()
        {
            cache = new Dictionary<Type, TableInfo>();
        }

   构造方法使用静态static 修饰符。静态构造方法,确保该构造方法只执行一次,不会还原初始化值,这就保证了数据缓存全局共享的作用。如果是Web程序我们可能会想到用Application来存储数据,如果脱离了Web程序呢,因此我们需要有自己的缓存机制。

  3. public static TableInfo Get<T>() where T:IEntity
        {
            Type type=typeof(T);
            if (cache.ContainsKey(type))
            {
                return cache[type];
            }
            else
            {
                return null;
            }
        }

  这个方法是一个泛型方法,泛型不用多说了,.net平台中不可缺少了,大大增加了语言的灵活性。关键是这个方法后面的约束,使用此约束保证了我们使用的实体类是实现了IEntity 接口的实体类。这是一种很霸道的写法,当然这是笑话。这样可以保证程序的准确性


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