数据访问层的改进以及测试DOM的发布

上一篇我们在宏观概要上对DAL层进行了封装与抽象。我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了;第二,使我们的DAL层能够支持一切数据访问技术,如Ado.net,EF,linq To Sql,这一点我们实现的不是很完美,仍有很大的改进空间,本文将加以改进。

在此之前我们来看一下我们最新的dom(PS:经过两天的赶工,我们的dom已经相对成熟,其中BLL层已经被我高度抽象化了,并且引进了业务上文文的概念;DAL层除了具体的技术实现尚为完成,其他方面已经相对完善了)

DAL层的AdoDal项目和EFDAL项目,分别代表采用ado.net技术和EF技术实现数据访问层,我在这两个项目中分别定义了一个OrderDAL测试类

和一个RolesDal测试类,代码如下

 

我们在BLL项目中的OrderBLL类来调用这RolesDal与OrderDAL的测试方法TestMethod()。注:我们的BLL层并没有引用DAL层,我们得到的DAL层实例,是通过工厂运用反射来实现的,至于,反射得到的OrderDAL,RolesDal是来自AdoDal项目还是EFDAL项目,完全是由我们的配置文件决定的,调用代码如下

我们的UI层项目StructUI也实现了与BLL层的解耦,它并没有引用BLL,它得到的BLL层实例同样是采用工厂根据配置文件通过反射来实现的。如下

从上面我们知道,UI层的页面是通过工厂创建OrderBussiness实体,然后调用Test()方法,在把结果展示在前台的文本域中。好了,现在我们来开始测试。首先,我们通过配置文件来设置对EFDAL项目中的OrderDAL和RolesDal实体进行测试,我们配置文件如下

结果如图:
 接着我们改变我们的配置文件,代码如下

结果如下:

综上,我们的框架实现了对数据访问层各类技术的支持,同时我们的成功的解除了框架中层与层的依赖(UI依赖BLL,BLL依赖DAL)。

下面我们来看一看目前版本的数据访问层相对于上一篇的数据访问层的改进,对照我们上一篇的项目结构(下图),我们发现在的数据访问层的DAL项目被干掉了,AdoDal,EFDal与DALFactory这三个新项目被添加进来了。

  

先说一说,我干掉DAL,同时又添加AdoDal,EFDal的原因。在上一篇文章,我们把对不同数据访问技术的实现寄托在ADOBase<T>类型与EFBase<T>类型上面,这两个类型最终将赋值给数据访问层基类的dalActive属性,来帮助基类实现数据层接口,至于是哪一个,则由配置文件说了算,我们采用工厂读取配置文件来创建这两个类型的实例,但是这里会碰到一个技术难题:这两个类型都是范型,我们无法事先知道该类型的范型参数在实例化时会是一个什么样的类型,所以我们没办法通过反射来动态读取程序集和类名创建对应的范型实例,因此,在上一篇我采用了一个非常简陋的工厂方来创建,如下

这样我们就通过条件判断语句写死了程序数据访问层所能使用的技术,在这个工厂里面除了ado.net和EF,它将不会去创建其他任何技术的访问实体。我们想要增加一种新的技术则必须重新修改工厂的代码,这样就违背了软件工程的一个原则:一个好的框架,应该是在需要什么功能的时候去扩展,而不应该是去修改以前的代码。

另一个促使我改变程序框架的原因是因为我们目前的这种业务背景和抽象工厂模式相当的吻合。我们数据访问层采用什么技术,业务逻辑层根本就不关心,我们完全可以定义两个工厂来创建两种不同技术的实例,然后根据配置文件来决定采用哪一个工厂。但是这里我们必须设想一种情况,那就是我们的数据访问层的实体相当的多,如果我们每一个实体都用工厂来创建的话,那么配置文件肯定会很大,配置文件的节点一多起来,第一个不便于维护,第二个,不便于理解。因此,我们必须找到替代的方法,我在数据访问层定义了2个仓库类型:ADOSession与EFSession。其中ADOSession用于获取AdoDal项目中的所有数据访问实体,EFSession用于获取EFDal项目中的所有实体,代码如下

ADOSession类型中在构造函数中需要传入了一个IDbConnection数据库连接实体,很显然这个IDbConnection会来自BLL层,这是因为我们的业务层需要有定制事务的能力,因此它必须能够得到IDbConnection来发起事务,当一个事务被发起时,所有在事务期间被创建的数据访问实体对数据库的操作必须是基于事务发起这的IDbConnection,这样的操作,才受事务的控制。因此这就要求我们的BLL层在创建DAL数据实体,有定义该实体的IDbConnection的能力,很显然,在构造函数中传入统一的IDbConnection是一个不错的选择。

好了ADOSession,EFSession我们都有了,现在我们假设我们如果能够在BLL层拿到这样的实体,那么我们是不是就能够获得AdoDal或EFDal的所有实体呢?答案是显然的,但是这样问题又来了,我们BLL并没有引用DAL,所以这两个仓库实体什么类型BLL肯定是不知道的,BLL只认接口,因此我们必须为仓库定义接口,如下

另外,我们还必须有相应的实例化机制,给BLL层的调用者提供实例化服务。因此我们想到提供两套数据访问层实例工厂来为调用者提供实例化,至于到底选择哪一套工厂,则完全由配置文件说了算。我们的两个工厂都实现了工厂接口,代码如下

在BLL层的业务上下文中,我们把对应的ISessionFactory在构造函数中通过工厂读取配置文件进行实例化,代码如下

配置文件参见本文DOM演示部分,在BLL层的业务上下文我们就可以通过ISessionFactory拿到ISession实体了,有了ISession实体我们就有了基于一种数据访问技术的所有数据访问层的实体了。我们BLL层可以大摇大摆的调用我们的数据访问实体操作数据库了。至此我们的数据访问层的抽象已经基本完成,剩下来的就是把数据访问层AdoDal,EFDal两个项目中的具体技术细节全部实现,这将是我后续文章的内容呢.......

总结

本文在上一篇文章的基础上面继续优化了数据访问层,使我们的数据访问层更加的完善与成熟。一个好的应用框架总是运用中被不断的完善,我们在开发的时候,多想一想我们所用框架的局限性,我们总能找到相应的优化点,最后感谢大家的观看,本文DOM的源码请点击  这里

 
 
分类: 框架
标签: 三层架构

数据访问层的改进以及测试DOM的发布的更多相关文章

  1. 企业级应用架构(三)三层架构之数据访问层的改进以及测试DOM的发布

    在上一篇我们在宏观概要上对DAL层进行了封装与抽象.我们的目的主要有两个:第一,解除BLL层对DAL层的依赖,这一点我们通过定义接口做到了:第二,使我们的DAL层能够支持一切数据访问技术,如Ado.n ...

  2. 【Hades】ades是一个开源库,基于JPA和Spring构建,通过减少开发工作量显著的改进了数据访问层的实现

    几乎每个应用系统都需要通过访问数据来完成工作.要想使用领域设计方法,你就需要为实体类定义和构建资源库来实现领域对象的持久化.目前开发人员经常使用JPA来实现持久化库.JPA让持久化变得非常容易,但是仍 ...

  3. servlet层调用biz业务层出现浏览器 500错误,解决方法 dao数据访问层 数据库Util工具类都可能出错 通过新建一个测试类复制代码逐步测试查找出最终出错原因

    package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.ServletException; i ...

  4. ClownFish:比手写代码还快的通用数据访问层

    http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...

  5. 使用JDBC构建简单的数据访问层

    本教程的目的是使用Java编写的分离的层去访问数据库中的表,这一层通常称为数据访问层(DAL) 使用DAL的最大好处是通过直接使用一些类似insert()和find()的方法简化了数据库的访问操作,而 ...

  6. 使用Ninject+Moq在单元测试中抽象数据访问层

    一.测试方法的业务逻辑时,通常都需要从数据库读取测试数据,但是每次初始化数据库数据都很麻烦,也会影响到其它业务对数据的访问,怎样抽象数据访问层呢?就是用Moq去模拟数据访问的逻辑     二.步骤如下 ...

  7. 数据访问层DAL(数据库访问抽象类DataProvider)

    晒晒数据访问层DAL,看看你的项目数据访问层使用的是什么形式,数据访问性能比较 采用什么样的数据访问形式是软件编码很重要的一个环节,良好的数据访问形式不仅能够提搞代码的执行效率,协作能力,更重要的是对 ...

  8. NHibernate:教你如何搭建数据访问层?

    NHibernate:教你如何搭建数据访问层? 什么是NHibernate NHibernate 是一个基于.net 的针对关系型数据库的对象持久化类库.NHibernate 来源于非常优秀的基于Ja ...

  9. 项目架构开发:数据访问层之Cache

    数据访问层简单介绍 数据访问层,提供整个项目的数据访问与持久化功能.在分层系统中所有有关数据访问.检索.持久化的任务,最终都将在这一层完成. 来看一个比较经典的数据访问层结构图 大概可以看出如下信息 ...

随机推荐

  1. 【电视桌面CSWUI】电视桌面(launcher)截图欣赏

    网络播放器是最重要的电视桌面.cswui,我们公司做了一个非常大的人力,物力搞一个电视柜.后来一一介绍,简言之发送屏幕截图.给大家看. watermark/2/text/aHR0cDovL2Jsb2c ...

  2. 探测器 C++ Singleton(辛格尔顿)

    一.静态模式不是单一的情况下, 刚开始学习的人可能误, 误以为所有的成员变量和成员方法用于 static , 就是单例模式了: class Singleton { public:     /* sta ...

  3. Parse 和 Swift 搭建一个像 Instagram

    如何用 Parse 和 Swift 搭建一个像 Instagram 那样的应用?   [编者按]本篇文章作者是Reinder de Vries,既是一名企业家,也是优秀的程序员,发表多篇应用程序的博客 ...

  4. CodeIgniter连接数据库及快速入门

    原文:CodeIgniter连接数据库及快速入门 一.数据库配置 CodeIgniter 有一个配置文件让你存放数据库连接值(username:用户名,password:密码,database nam ...

  5. thinkphp学习笔记9—自动加载

    原文:thinkphp学习笔记9-自动加载 1.命名空间自动加载 在3.2版本中不需要手动加载类库文件,可以很方便的完成自动加载. 系统可以根据类的命名空间自动定位到类库文件,例如定义了一个类Org\ ...

  6. Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

    1.错误叙述性说明 2014-7-12 0:38:57 org.apache.catalina.core.ApplicationContext log 信息: No Spring WebApplica ...

  7. HTML5分析实战Web存储机制(Web Storage)

    Web Storage它是Key-Value在持久性数据存储的形式.Web Storage为了克服cookie把所引起的一些限制.当数据需要严格格控制client准时,没有必要不断地发回数据serve ...

  8. C#记录日志、获取枚举值 等通用函数列表

    )             {                 ] >=  && ipvals[] <=                  && ipval ...

  9. ASP.NET MVC学习之控制器篇扩展性

    原文:ASP.NET MVC学习之控制器篇扩展性 一.前言 在之前的一篇随笔中已经讲述过控制器,而今天的随笔是作为之前的扩展. 二.正文 1.自定义动作方法 相信大家在开发过程一定会遇到动作方法的重名 ...

  10. Cocos2d-x之MenuItem

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...