在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供相应的支持。所以今天我们要做的事情有两件,第一,定义我们的数据访问层接口;第二,屏蔽各类数据库访问技术的差异,提供统一的数据库访问模型。举个例子,我们只需要修改一下我们的配置文件,就能够把ADO.NET的实现方式,改变成EF的实现方式。好下面搭建我们的三层构,如图:
项目的框架与上一篇基本一致。项目的引用关系: StructUI->Common,Model,BLL; BLL -> Model,IDAL,Common,Factory;DAL-> IDAL,Model。再次提醒各位,我们在BLL层并没有引用DAL,我们不能创建(new)DAL层的任何实体。
下面,我们来定义DAL层的接口。定义层次的接口其实是一件很复杂的事情,首先,我们必须抽象出该层内所有对象有的属性与行为。对于数据访问层的对象,很明显增删改查是肯定走不掉的。其次我们必须充分的考虑,数据访问层各类技术对该接口的实现难度,技术上没法实现的接口,肯定是没有任何意义的。本文仅当示范作用,所以暂时我定义的接口会很简单,在后续的章节,我会抽象出一套完备的数据接口。该层的任何实体,都具备增删改查功能,所以我们首先定义该层的全局接口IDALBase<T>,即任何数据访问实体,都应该实现的接口,代码如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace IDAL { public interface IDALBase<T> where T : class { /// <summary> /// 向T对应的数据表插入 /// 一条数据 /// </summary> /// <param name="entity"></param> /// <returns>true:成功,false:失败</returns> bool Insert(T entity); /// <summary> /// 修改数据表中与entity /// 实体对应的记录 /// </summary> /// <param name="entity"></param> /// <returns>true:成功,false:失败</returns> bool Update(T entity); /// <summary> /// 删除数据表中与entity /// 实体对应的记录 /// </summary> /// <param name="entity"></param> /// <returns>true:成功,false:失败</returns> bool Delete(T entity); /// <summary> /// 查询数据库表中指定的ID /// 的记录 /// </summary> /// <param name="ID">标识ID</param> /// <returns>指定ID记录对应的实体</returns> T Query(int ID); } }