一个概念只有将其放到一个具体的上下文中,其含义和作用才会清晰、明确。脱离了上下文,概念就失去了其价值和生命力。所以,学习使用任何技术或概念的时候,有一件事情是非常重要的,那就是透彻地理解该技术概念所位于的上下文,这将有助于我们更好地使用和驾驭这个技术。
在ORM流行的今天,数据访问框架层出不穷,但是这些框架所基于的上下文几乎都会有些不一样,要想将一个数据访问框架运用得炉火纯青,必须要掌握该框架所基于的上下文。同理,如果你想发挥DataRabbit框架的巨大威力,在之前,你绝对有必要了解一下DataRbbit的上下文。
一.纯ORM ?
在DataRabbit发展过程中,我曾作了一个非常重要的决定:不能把DataRabbit定位为一个纯粹的ORM框架,即所有的数据访问功能都基于ORM来实现。原因很简单,ORM并不能完成所有的事情(即使能完成所有的事情,那么也需要花费巨大的代价),有些数据库访问还是需要基于关系来进行,对于那些不提供基于关系进行数据访问操作的纯ORM框架,我认为其决策是不明智的。所以,在DataRabbit中,基于ORM的数据访问和基于关系的数据访问各占了一半的天空,这使得我们在无法用ORM达成或很难使用ORM达成的地方,可以转向使用基于关系的访问器来达成。
除了核心的ORM访问器和基于关系的访问器来访问数据表中的数据外,DataRabbit还提供对数据表的“大纲”进行访问和操作的功能,这是因为我们经常有这样的需求:获取数据表的某个字段的信息、或找到主外键关系、或者需要动态创建一个具有指定大纲的数据表。目前版本的DataRabbit提供的大纲操作功能还比较单薄,以后会逐渐进行增强。
二.DataRabbit中的核心理念
1.轻量、弱侵入性。比如,DataRabbit对你的数据库设计没有任何要求(而有的数据访问框架可能要求数据表必须有唯一主键)。
2.约定优于配置。使用DataRabbit不需要任何配置,这使得DataRabbit更加易用。
3.数据库类型无关性。统一的数据访问接口屏蔽了数据库类型的差异,目前版本的DataRabbit内置了对SqlServer和Oracle的支持,可以通过插件的方式来支持其它类型的数据库。
4.DataRabbit中的所有数据访问功能都是由各种访问器(如IOrmAccesser、IRelationAccesser、ITableAccesser、IDataSchemaAccesser、IEntityRelationLoader、ISPAccesser)来提供的。
5.所有的访问器接口的引用都可以从DataRabbit的根(“Root”)获得,在DataRabbit中,这样的根有两个,一个是IDataAccesser接口,另一个是TransactionScope。
6.一个根(“Root”)实例就对应着一个数据库。也可以这么说,针对一个特定的数据库,我们的应用只需要维护一个DataRabbit Root即可。
7. DataRabbit提供的所有的访问器(如IOrmAccesser)都可以在两种环境中工作:事务环境和非事务环境。这是由所有的访问器都继承了的ItransactionAccesser这个接口体现出来的。
8.任何一个访问器实例,如果在非事务环境中工作,那么它就是无状态的,DataRabbit将以Singleton的模式提供它的实例;如果访问器实例工作于事务环境中,那么它就是有状态的,并且它的生命期将随事务的结束而结束,DataRabbit以“Single Call”的模式提供它的实例。
三.DataRabbit中的ORM理念
DataRabbit所采用的ORM理念非常单纯、简单,其主要特点如下:
1.ORM仅仅对单表进行操作,不支持多表联合访问。对于多表联合访问的ORM解决方案,我还没有一个好的主意。
2.数据库中的一个数据表Table就对应着一个Entity Class定义,它们之间是一对一的映射关系。
(1)为了省去不必要的麻烦,Entity Class的类名最好与对应的Table的名字完全一致。这样DataRabbit可以方便地根据Entity Class的名字找到数据库中对应的表,或者反过来。
(2)Table中的每个列对应着Entity Class中的一个属性,列和属性的名字要求完全一致,并且,它们的类型是匹配的。
(3)Table中的一条记录就对应着一个Entity Object。
3.ORM数据访问操作的定义不是位于Entity Class中,而是定义于专门的ORM访问器(IOrmAccesser)中。从这个意义上来说,Entity Class更像是一个仅仅封装了数据的结构,而不是一个类。
4.ORM访问器采用泛型和反射技术实现,这样,DataRabbit只需要提供一个ORM访问器类,便可以对数据库中的所有表进行ORM访问。
5.ORM访问器通过泛型参数来标志要访问哪个表。泛型参数还有一个好处是,所有的ORM访问操作都是强类型的。
6.使用Filter来表示单个的查询条件。ORM的一个非常重要的目的,就是屏蔽所有的SQL语句,所以Sql条件子句也需要被抽象建模。
7.使用IFilterTree接口来抽象复杂的多个查询条件的组合。
四、DataRabbit对N层架构提供支持
DataRabbit在设计实现的时候,就考虑了如何更好的支持系统架构,所以,DataRabbit可以非常平滑无缝地融合到3层/N层架构中。关于这方面的详细介绍可参见:DataRabbit 轻量的数据访问框架(12)-- 将DataRabbit融入架构
分享到:
相关推荐
上下文帮助\help.rtf 制作的RTF文件 上下文帮助\help.hpj 制作的HPJ文件 上下文帮助\help.hlp 制作的HLP文件 上下文帮助\autohelp 自动添加WinHelp帮助实例源码 上下文帮助\autohelp 自动添加...
计算理论-上下文无关文法 计算理论-上下文无关文法 计算理论-上下文无关文法
DAX指南:理解行上下文和筛选器上下文的不同对正确使用DAX是至关重要的基础。
js上下文理解js上下文理解js上下文理解js上下文理解js上下文理解js上下文理解js上下文理解js上下文理解js上下文理解js上下文理解
python学习笔记,包含迭代器-生成器-with语句和上下文管理器-修饰符
OC-多线程-上下文切换
android中上下文菜单与上下文操作模式的简介与使用
潜在狄利克雷分配(LDA)主题模型是处理非结构化文档的有效工具。但是它是建立在词袋模型(bag of word,BOW)假设上的,这种...通过实验表明,基于中心词的上下文主题模型在未知数据集上具有更高的精度和收敛速度。
这篇文章我们主要讲述了:上下文的理论和基于上下文(COT)的操作转换算法。COT算法是一种能够支持do和某一操作的任一形式的undo的算法,而且COT算法不要求转换函数满足可逆性、收敛性质2以及反向性质2和3。COT算法...
( 对Linux内核中进程上下文和中断上下文的理解
拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到性能,甚至可能导致应用程序不响应或者使用的内存随时间不断累积。要...
Linux进程上下文切换和中断上下文切换Linux缺页中断和中断区别。
行业分类-设备装置-基于上下文的项目加书签
形式语言与自动机理论--第六章 上下文无关语言1(第十三周).ppt
IO空间 内存管理 平台设备 中断上下文与进程上下文
本文综合上下文感知计算1方面的研究成果,深入分析和讨论了上下文感知中间件设计中的几个关键问题:系统架构、上下文建模与推理、上下文冲突与不确定性、上下文发现与接入、隐私与安全,并介绍我们在VINCA服务网格中...
计算机理论导引实验报告2-上下文无关文法(CFG).doc
对于linux中进程上下文和中断上下文的理解
jQuery Context Menu - jQuery上下文菜单插件