在我以前的基于Enterprise Library的框架里面,定义了一个超级的数据访问基类,是特定数据访问类基类的基类,AbstractBaseDAL的数据访问层基类定义了很多通用的接口,具有非常强大的操作功能,如下所示。
这里面的很多接口命名我都经过了一些推敲,或者我基于我或者我客户群体的使用习惯和理解考虑,也是想沿承这些命名规则,扩充我这个基于泛型的仓储模式的实体框架基类接口。
下面是各类不同接口的定义内容。
1)增加操作
2)删除操作
3)修改操作
4)主键查询以及条件查询操作
5)集合查询(分返回IQueryable和ICollection<T>两种方式)
6)分页查询操作
这样我们在BaseDAL里面,把这些接口全部实现了,那么所有继承这个基类对象的数据访问对象,就具有这些标准的接口了,也给我们开发实现了整体性的统一。
首先我们来看看这个基类BaseDAL的初始化定义代码。
有了这些DbContext对象以及DbSet<T>对象,具体的接口实现就很容易了,下面我抽几个代表性的函数来介绍实现。
1)增加对象
2)删除对象
3)修改对象
4)根据条件查询
5)分页查询
更多的代码就不一一贴出,反正我们全部实现自己所需的各种操作就可以了,这里要提的是,我们尽可能利用Lambda表达式进行条件处理,包括查询、删除等条件处理。
对上面的这些常规接口,我们调用代码处理的例子如下所示。
如果需要考虑分页,以上接口已经定义了分页处理的接口和实现了,我们在业务对象里面直接调用接口就可以了,具体代码如下所示。
在EF里面实现异步(并行)非常容易,在.NET 4.5里由于async/await关键字的出现,使得实现异步变得更加容易。
使用await关键字后,.NET会自动把返回结果包装在一个Task类型的对象中。使用await表达式时,控制会返回到调用此方法的线程中;在await等待的方法执行完毕后,控制会自动返回到下面的语句中。发生异常时,异常会在await表达式中抛出。
我们基本上所有的增删改查、分页等接口,都可以使用异步操作来定义这些新接口,代码如下所示。
1)增加对象异步实现
异步定义的接口如下所示
接口的实现如下所示
和普通的接口定义不一样的地方,我们看到异步的接口都是以Async结尾,并且返回值使用Task<T>进行包装,另外实现里面,增加了async的定义,方法体里面增加 await 的关键字,这些就构成了异步操作的接口定义和接口实现了。
2)条件删除异步实现
我们再来看一个复杂一点的条件删除操作,代码如下所示。
定义接口
接口实现
我们定义的这些异步接口,基本上都是类似的操作,但是我们应该如何调用异步的处理呢?
好像有两个调用代码方式。
1)使用async和await关键字处理
2)使用 await Task.Run的处理方式
两种方式都能正常运行,并得到所要的效果。
本篇主要介绍了基类接口的统一封装、并增加所有必要的增删改查、分页查询、Lambda条件等处理方式,还有就是增加了相关的异步操作接口和实现,随着我们对通用功能的进一步要求,可以为基类增加更多的接口函数。
这个系列文章索引如下:
<a href="http://www.cnblogs.com/wuhuacong/p/4336248.html">Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)</a>
<a href="http://www.cnblogs.com/wuhuacong/p/4338564.html">Entity Framework 实体框架的形成之旅--基类接口的统一和异步操作的实现(3)</a>