NFramework开源AOP框架ORM的实现原理与应用.doc_第1页
NFramework开源AOP框架ORM的实现原理与应用.doc_第2页
NFramework开源AOP框架ORM的实现原理与应用.doc_第3页
NFramework开源AOP框架ORM的实现原理与应用.doc_第4页
NFramework开源AOP框架ORM的实现原理与应用.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NFramework开源AOP框架ORM的实现原理与应用-.NET教程,.NET Framework1. 基本概念对象关系映射(object relational mapping,简称orm)是一种为了解决面向对象与关系数据库存在的互不匹配现象的技术。简单的说,orm是通过使用描述语言来描述数据库与对象之间的映射关系,并将程序中的对象自动持久化到关系数据库中,本质上就是将数据从一种形式转换到另外一种形式。2. nhibernatenhibernate目前可谓如日中天,许多人都在谈论它,并且也得到了广泛的应用,但在我的项目经历中,即使应用nhibernate这样的好工具也有痛苦的时候,大量的xml文件让我们眼花缭乱,简单易学的hql语言却又常常不能满足我们的要求。特别是随着系统的复杂性越来越高,再加上人员的流动,最终xml堆积如山,若干事件以后不再有人记得那个xml文件是用来做什么的了。nhibernate本身对sql的封装做的很好,但或许这也成为了我们的束缚,对于非常复杂的业务问题,我们的调试变得更困难,要在代码与数个xml文件之间不停的查阅以期快速定位问题的所在,这增加了我们的调试难度。3. 考虑到了这种情况,因此它将sql释放出来,让我们可以一目了然。但同样也存在xml数据量过多的情况。随着系统的不断升级,我们不得不考虑膨胀的xml文件对内存的占用问题。当然,可以快速的溶入到现有的项目中,在不改变既有方案的前提下为我们提供一种新的思路来解决实际的问题,这是一个不错的优点。但纵观nhibernate也好、也好,其应用代码中都有一些严重的重复问题,比如说opensession、closesession、getfactory类似这样的代码,这对只关注业务的开发人员来说也是一个不小的工作量。4. nframeworknframework在设计orm时,充分考虑了目前流行了orm框架,如nhibernate、这两个流行的产品。当然nframework也不可能没有缺点,但它为开发人员考虑的更多。首先从部署的角度来讲,nframework没有采用xml文件作为orm的映射描述,而是采用了扩展元数据的方式,这在很大程度上减轻了维护xml文件的负担,在部署时也只是一个简单的dll文件。nframework中的实体(entity)本身没有包括任何crud相关的方法,因此可以说是一个“轻量级的实体”,你不必担心由于大量的对实体对象的new操作导致系统占用资源过多而性能有所下降。nframework中的实体只包括映射的元数据与对象属性,因此它是轻量级的,在我们的实际测试中,在用户大量的并发操作时,创建新实体对象占用的资源微乎其微。在做到轻量级的同时,nframework并没有以降低映射的灵活性和效率性为前提,通过自定义的元数据,不但可以映射出数据表、视图、字段、字段类型、字段长度的映射关系,还可以轻松映射出多表之间的关联信息。下面我们来比较一下nframework与以nhibernate为代表的orm框架之间的不同。 比较项目nframeworknhibernate速度直接使用dll做为载体,因此速度较快(当然,这里使用了反射,速度主要取决于反射的速度)。视配置文件的大小,另外有文件的io操作,另外大量的xml文件,对内存也提出了比较大的要求。易用性简单,和操作正常的类一样。相对复杂,需要对了解每一个xml文件配置节属性,有一定的学习难度。可维护性简单,可以直接用代码跟踪调试。相对复杂,每个xml文件都需仔细校验,无法在编译期间检查错误。可部署性方便部署,只需复制实体的dll,如果实体有变化在编译期就可发现错误相对麻烦,每个xml文件都要被部署到服务器,对于遗漏的文件将产生运行时错误,无法被早期发现,并且设置xml文件的路径都是比较繁琐的事情。映射效率性晚期绑定,因此对于数据表字段的类型、大小等更改不影响代码,映射效率高。早期绑定,对于数据表的更改要将所有相关的xml配置文件也重新修改,对于配置文件较多的情况无疑会产生巨大的工作量灵活性由于实体要被编译成dll的形式,因此灵活性相对较差非常灵活,这归功于xml文件的灵活性5. 开发人员参考nframework中的orm使用对开发人员来说十分简单,可以使用nframework提供的代码生成器,从实际的数据表或视图中快速的生成实体类代码,下面以用户实体为例来说明nframework中orm的使用。5.1. 生成实体类首先,使用代码生成器根据实际的数据表生成了如下内容的用户实体类代码:/*版权信息:版权所有(c) 2006,intelligencesoft corporation作 者:moneystar完成日期:2006-02-22内容摘要:用户实体类*/ using system;using system.data;using system.runtime.serialization; using mon;using mon.entity;using mon.enum; namespace anization / / 用户实体类 / serializable ormaping(tablename=t_system_user) /映射的实际数据表名称 public class userentity : baseentity /必须继承实体基类 /用户id private string m_user_id; /用户名称 private string m_user_name; /登录名称 private string m_login_name; /密码 private string m_login_password; / / 用户id / (fieldname=user_id,ispk=true,isselected=true,isinserted=true,isupdated=true) / ormaping(fieldname=user_id,ispk=true,isselected=true,isinserted=true,isupdated=true) public string userid get return m_user_id; set m_user_id = value; / / 用户名称 / (fieldname=user_name,ispk=false,isselected=true,isinserted=true,isupdated=true) / ormaping(fieldname=user_name,ispk=false,isselected=true,isinserted=true,isupdated=true) public string username get return m_user_name; set m_user_name = value; / / 登录名称 / (fieldname=login_name,ispk=false,isselected=true,isinserted=true,isupdated=true) / ormaping(fieldname=login_name,ispk=false,isselected=true,isinserted=true,isupdated=true) public string loginname get return m_login_name; set m_login_name = value; / / 密码 / (fieldname=login_password,ispk=false,isselected=true,isinserted=true,isupdated=true) / ormaping(fieldname=login_password,ispk=false,isselected=true,isinserted=true,isupdated=true) public string loginpassword get return m_login_password; set m_login_password = value; 5.2. 实体类编码说明ormaping类用于设置对象与数据表的映射信息,通过ormaping我们很容易定义出各种映射关系。另外,实体类需要从baseentity基类继承,baseentity类是nframework框架的重要类之一。利用baseentity类中提供的方法可以方便的获取实体与数据表的影射关系,比如说映射的表名、某个属性所对应的字段名等等。不过,baseentity最重要以及最常用的功能则是实体与datatable之间的转换。只需调用一个方法就可以将实体转换成datatable,或者从datatable转换成实体,而这一切不需要再编写额外的其它代码,从而大大减少了编码的工作量。根据以上的实体类代码,我们就可以使用如下方法方便的实现实体与datatable之间的转换。举例来说: l 将实体转换成datatable userentity user = new userentity();datatable dt = user.convertto(); /一个方法就可以转换了 l 将datatable转换成实体 datatable dt = new datatable(); userentity user = new userentity();user.convertfrom(dt);/一个方法就可以转换了,也可以使用user.parse(dt)方法 这里要说明的是baseentity类提供了两个方法从datatable转换成实体,即convertfrom和parse。这两个方法都可以实现转换的功能,但它们之间有什么区别呢?我们知道,利用sql语句返回查询结果时通常是一个datatable形式,而datatable中的列名是根据sql语句中的查询列名来定义的,因此这就产生了datatable中的列如何与实体属性值匹配的问题。convertfrom方法通过获取实体属性映射的字段名,进而在datatable中查找同名的列,一旦找到同名列,则会使用此列值作为实体属性值的数据源。parse方法和convertfrom相同,只不过parse方法使用实体属性名的字符串形式在datatable中查找,然后再进行匹配。另外要说明的就是convertto方法,在使用这个方法将实体转换成datatable时,会使用实体属性名称的字符串形式来创建datatable列,这样在将datatable绑定到datagrid时就可以直接使用属性名称了,而不用再关心数据库中的表结构,即使用表的字段名改变了也只需要改动实体属性名的映射值就可以了,对现有代码无任何影响,这充分体现了orm的思想,因此convertto方法是非常重要方法,尽管它会带来一些性能上的开销,但在屏蔽数据库方面却有着非常重要的作用。5.3. 实体类持久化操作由于实体本身没有提供任何crud等相关方法,因此对实体的任何操作都是通过nframework数据访问功能提供的方法。还是用户实体为例,下面的代码为我们展示crud的编码方式: / / 获取方法/ 同时这个方法也演示了不使用事务进行数据的访问,由nframework负责打开连接/ 及自动关闭连接 / / id / 实体 public userentity getentity(string userid) userdal dal = new userdal(); userentity user = new userentity(); try /没有使用事务进行数据访问,nframework负责打开连接以及自动关闭连接 user.userid = userid; user.convertfrom(dal.getentity(user); catch (exception ex) / nframework错误处理机制 errorhandler.handleerror(ex); return user; / / 新增方法 / 这个方法同时演示了使用aop自动事务的处理方式 / / 实体 / 部门id / 主键id transaction /使用aop自动事务元数据标识 public string insert(userentity user) userdal dal = new userdal(); / guid主键 user.userid = dal.getguid(); /新增 dal.insertentity(user); /返回新增的用户id return user.userid; / / 更新方法 / 这个方法演示了不使用aop时的事务处理方式 / / 实体 public void update(userentity user) userdal dal = new userdal(); try /开启事务 dal.synctrans(this.begintransaction(); dal.updateentity(user); /递交事务 mit(); catch (exception ex) /回滚事务 this.rollback(); errorhandler.handleerror(ex); / / 删除 / / id public void delete(string userid) userdal dal = new userdal(); userentity user = new userentity(); try /开启事务 dal.synctrans(this.begintransaction(); user.userid = userid; dal.deleteent

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论