基于配置的ORMapping框架浅析之2(以自己开发的框架为例子)

 

CoreLibrary 讲解:

对于一个实体类的数据处理层,有两个数据访问类与之配对 (DataAccessor  和  DataMapper )

以 后缀 DataAccessor 的类 :直接和数据库层打交道,比如:新增,插入,修改等等

以 后缀 DataMapper  的类:直接位于DataAccessor 上一层,负责调用DataAccessor  类,

                                      有点透明代理的作用,其他的作用是在里面处理cache等信息

(注:在框架的演化过程中,启用了AOP横切技术思想,因此DataMapper的类的作用被弱化,

  可能考虑在今后的版本中去掉)

 

 

 

 

 

 

 

 

 

IBaseDataAccessor              基础操作(插入,更新,删除)

INormalQueryDataAccessor   查询操作

IReferenceQueryDataAccessor    引用操作(

    对于一般的类,查询只需返回对象即可,而对于接口和抽象类,

    因为不能实例化,所以只能通过传入引用来获取数据)

    接口只有一个方法 void FindInheritObject(IDomainObject obj);

 

下面的类就是继承它们的接口然后实现之。

BaseDataAccessor类是一个抽象类,里面实现了某些方法,这些方法是通用方法

  1. public abstract class BaseDataAccessor:IBaseDataAccessor
  2. {
  3.     public abstract Type GetDomainObjectType();
  4.     public abstract bool IsValidType(IDomainObject obj);
  5.     public abstract Guid InSave(IDomainObject obj, bool IsNew);
  6.     public abstract Guid InSave(IDomainObject obj, bool IsNew, BusinessTransaction Trans);
  7.     public abstract void InDelete(IDomainObject obj);
  8.     public abstract void InDelete(IDomainObject obj, BusinessTransaction Trans);
  9.         public abstract void InDelete(Guid key);
  10.         public abstract void InDelete(Guid key, BusinessTransaction Trans);
  11.     public abstract void InDelete(StatementSource source);
  12.     public abstract void InDelete(StatementSource source, BusinessTransaction Trans);
  13.         /// <summary>
  14.     /// 获取具体类的DBInstance
  15.     /// </summary>
  16.     /// <returns></returns>
  17.     public string GetDBInstance()
  18.         {
  19.         }
  20.         /// <summary>
  21.         /// 获取具体类的读数据库的DBInstance
  22.         /// 注解:某些系统采用读写分离方式,即写入数据在一个数据库,读取数据在另外一个数据库,
  23.          /// 两个数据库采取发布订阅的方式进行数据同步
  24.          /// </summary>
  25.         /// <returns></returns>
  26.         public string GetReadDataInstance()

 

获取数据库实例就是使用的微软企业库的代码

 

这几个核心类实现了对象间继承关系的扭转,完成将一个对象的数据放到不同的表中间去,

当然对于没有继承关系的表就更没有问题了。

 

同时由于继承关系被它们实现再加上配置文件的管理,因为生成的实体数据库操作类的代码几乎全部一致,

也就产生了后面的使用了自动代码生成器来生成这些实体类和实体控制类,

完成后台代码开发的90%以上工作量的自动化。

 

  1. [Serializable]
  2.     
  3. public abstract class BaseUser:DomainObject
  4. {
  5.         
  6.        public string Email
  7.        {
  8.             get;
  9.             set;
  10.        }
  11.         
  12.        public string Type 
  13.        { 
  14.             get
  15.             set
  16.        } 
  17.    
  18. }
  19. [Serializable]
  20.    
  21. public  class Users:BaseUser
  22. {
  23.        
  24.         public string UserName
  25.         {
  26.             get;
  27.             set;
  28.         }
  29.        
  30.         public string UserPwd
  31.         {
  32.             get;
  33.             set;
  34.         }
  35.         
  36.         public DateTime CreateTime
  37.         {
  38.             get;
  39.             set;
  40.         }
  41.         
  42. }
  43. //控制类
  44. internal class BaseUserDataAccessor:InterfaceVersionDataAccessor
  45. {
  46.     private string __dataDBInstance = string.Empty;
  47.         private string __dataReadDBInstance = string.Empty;
  48.         private Database db = null;
  49.         private Database dbRead = null;
  50.     public BaseUserDataAccessor()
  51.     {
  52.         __dataDBInstance = this.GetDBInstance();
  53.             __dataReadDBInstance = this.GetReadDataInstance();
  54.         this.InitGeneralizationDataAccessor();
  55.             db = DatabaseFactory.CreateDatabase(__dataDBInstance);
  56.             dbRead = DatabaseFactory.CreateDatabase(__dataReadDBInstance);
  57.             
  58.             
  59.     }
  60.     public override Type GetDomainObjectType()
  61.     {
  62.         return typeof(BaseUser);
  63.     }
  64.     public override bool IsValidType(IDomainObject obj)
  65.     {
  66.             if(obj is BaseUser)
  67.             {
  68.                 return true;
  69.             }
  70.             else
  71.             {
  72.                 return false;
  73.             }
  74.     }
  75.         public override Guid InSave(IDomainObject obj, bool IsNew)
  76.     {
  77.             
  78.         try
  79.         {        
  80.                         Guid key = INInSave(obj, IsNew);    
  81.             return key;
  82.         }
  83.         catch(Exception ex)
  84.         {    
  85.                 throw ex;
  86.         }
  87.     }
  88.         public override Guid InSave(IDomainObject obj, bool IsNew, BusinessTransaction Trans)
  89.     {
  90.         try
  91.         {
  92.                 
  93.                 Guid key = INInSave(obj, IsNew, Trans);
  94.             return key;
  95.         }
  96.         catch(Exception ex)
  97.         {
  98.             throw ex;
  99.         }
  100.     }
  101.     public override void InDelete(IDomainObject obj)
  102.     {
  103.             
  104.         try
  105.         {
  106.             INInDelete(obj.Key);
  107.         }
  108.         catch(Exception ex)
  109.         {
  110.             throw ex;
  111.         }
  112.     }
  113.     public override void InDelete(IDomainObject obj, BusinessTransaction Trans)
  114.     {
  115.         try
  116.         {
  117.             INInDelete(obj.Key,Trans);
  118.         }
  119.         catch(Exception ex)
  120.         {
  121.             throw ex;
  122.         }
  123.     }
  124.         public override void InDelete(Guid key)
  125.     {
  126.             
  127.             try
  128.             {
  129.                 INInDelete(key);
  130.             }
  131.             catch(Exception ex)
  132.             {
  133.                 throw ex;
  134.             }
  135.     }
  136.         public override void InDelete(Guid key, BusinessTransaction Trans)
  137.     {
  138.             try
  139.             {
  140.                 INInDelete(key,Trans);
  141.             }
  142.             catch(Exception ex)
  143.             {
  144.                 throw ex;
  145.             }
  146.     }
  147.     public override void InDelete(StatementSource source)
  148.     {
  149.             
  150.         try
  151.         {
  152.           ArrayList list = new ArrayList();
  153.           list = GetKeyList(source);
  154.           for(int i=0;i<list.Count;i++)
  155.           {
  156.                     Guid key = GuidParse.GetGuidType(list[i].ToString());
  157.             this.INInDelete(key);
  158.           }
  159.         }
  160.         catch(Exception ex)
  161.         {
  162.             throw ex;
  163.         }
  164.     }
  165.     public override void InDelete(StatementSource source, BusinessTransaction Trans)
  166.     {
  167.         try
  168.         {
  169.                 
  170.                   ArrayList list = new ArrayList();
  171.           list = GetKeyList(source);
  172.           for(int i=0;i<list.Count;i++)
  173.           {
  174.                         Guid key = GuidParse.GetGuidType(list[i].ToString());
  175.             this.INInDelete(key,Trans);
  176.           }
  177.         }
  178.            catch(Exception ex)
  179.         {
  180.             throw ex;
  181.         }
  182.     }
  183.     public override void FindInheritObject(IDomainObject obj)
  184.     {
  185.             。。。
  186.     }
  187.         private Guid INInSave(IDomainObject obj, bool IsNew, BusinessTransaction Trans)
  188.     {
  189.             try
  190.             {
  191.                                 。。。
  192.                 this.InSaveGeneralizationDataAccessor(obj,true,Trans);//处理继承的父类
  193.                 strSQL = "Insert into ["+this.GetDomainObjectType().Name+"]"+
  194.                         "(ID,Email) Values(@ID,@Email)";
  195.                 。。。
  196.                 return obj.Key;
  197.             }
  198.             catch(Exception ex)
  199.             {
  200.                 throw ex;
  201.             }
  202.         }
  203.         private Guid INInSave(IDomainObject obj, bool IsNew)
  204.         {
  205.             try
  206.             { 
  207.                。。。                
  208.                return obj.Key;
  209.             }
  210.             catch (Exception ex)
  211.             {
  212.                 throw ex;
  213.             }
  214.         }
  215.     private void INInDelete(Guid key, BusinessTransaction Trans)
  216.     {
  217.             try
  218.             {
  219.                 string strSQL = "Delete From [" + this.GetDomainObjectType().Name + "] where ID=@ID";
  220.                 
  221.                 this.InDeleteGeneralizationDataAccessor(key,Trans);//处理继承的父类
  222.             }
  223.             catch(Exception ex)
  224.             {
  225.                 throw ex;
  226.             }
  227.     }
  228.         private void INInDelete(Guid key)
  229.         {
  230.             try
  231.             {
  232.                 
  233.                。。。            
  234.             }
  235.             catch (Exception ex)
  236.             {
  237.                 throw ex;
  238.             }
  239.         }
  240.     private ArrayList GetKeyList(StatementSource source)
  241.     {
  242.         try
  243.         {
  244.                    。。。                
  245.                    return IDList;
  246.         }
  247.         catch(Exception ex)
  248.         {
  249.            throw ex;
  250.         }
  251.     }
  252. }

 

 

 

 

从代码中可以看出, BaseUserDataAccrssor   和 UserDataAccessor 继承的类不一样,因

为实体类BaseUser是抽象类,而User是一般的类。 抽象类不能实例化,

因此在DataAccessor里面没有Select之类有返回对象的方法,

而UserDataAccessor 类就存在返回对象的查询方法

 

比如: public override IDomainObject SelectByPK(Guid key)

 

框架的关键之一也就在这里

DataAccrssor 类除了处理自身实体类的数据操作,还要调用父类的DataAccrssor 方法来完成数据插入到父表的操作

InSaveGeneralizationDataAccessor(obj, false); 这个方法实现了把对象中的属于父亲类的属性值插入到父表中去

InDeleteGeneralizationDataAccessor(key,。。。); 这个方法完成删除操作(先删除子类的记录,再删除父类的记录)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值