ASP.NET MVC+EF框架+EasyUI实现权限管理系列(7)-DBSession的封装
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(7)-DBSession的封装
ASP.NET MVC+EF框架+EasyUI实现权限管系列
(开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装
(5):前台Jquery easyUI实现 (6):EF上下文实例管理
前言:上篇博客中我们重新对EF框架实现上下文进行了重新的操作,而且我们也建立了DbSession,使用CallContext类帮我们返回当前线程内唯一的数据库上下文,这样的话我们就在基仓储里面再也不用new实例话,只需要使用简单工厂来调用EFContextFactory里面实现线程内唯一的方法:GetCurrentDbContext,那么这篇博客我们继续来说DbSession类的封装,此系列已经写到了7了,我在这里建议大家在阅读的时候能够全部阅读,或者你本来明白这种模式的话就不需要了,那么DbSession类究竟有什么神奇之处,请看下面的介绍。
1. EFContextFactory线程内唯一复习
(1)在这里我们再解释一下线程内唯一,拿用老师的说法就是,假设这个线程就是衣服,而每件衣服上面都有口袋,那么我们就可以把这个口袋看成数据槽(CallContext指向的那一块内存空间),每件衣服都会有自己的口袋(特殊的除外),而这时候你要从衣服口袋里面拿出去一个糖,这时候我要先去口袋里面检查检查有没有,如果衣服口袋里面有我们就拿出来,负责我先将糖放到衣服口袋里,你下次来的时候继续在判断有没有。而且每件衣服都有自己独立的口袋,他们是没有任何关联的,着就保证了每件衣服内都会有糖(线程内唯一)。
(2)CallContext可以帮助我们保证线程内唯一。
2.DbSession
(1)在DbSession中封装了我们所有仓储的属性,在属性里面我们能够拿到我们仓储的实例,那么DbSession可以看成是我们整个数据库访问层的统一入口,另外在DbSession里面我们有封装了一个SaveChanges方法,那么在SaveChanges里面怎么做呢?请看下面的代码:
namespace LYZJ.UserLimitMVC.DAL
{
//一次跟数据库交互的会话
public class DbSession //代表应用程序跟数据库之间的一次会话,也是数据库访问层的统一入口
{
public IDAL.IRoleRepository RoleRepository
{
get { return new RoleRepository(); }
}
public IDAL.IUserInfoRepository UserInfoRepository
{
get { return new UserInfoRepository(); }
}
//代表:当前应用程序跟数据库的绘画内所有的实体的变化,更新会数据库
public int SaveChanges()
{
//调用EF上下文的SaveChanges方法
return DAL.EFContextFactory.GetCurrentDbContext().SaveChanges();
}
}
}
(2)我们封装了一个SaveChanges方法的话,它就直接去获取当前线程里面的上下文,然后调用上下文的SaveChanges方法,就相当于直接把当前线程内部所有实体的改变提交到数据库里面,看上面的代码可能大部人都没有什么感觉,这是干什么呢?这时候我在作一个工作,就是将BaseRepository(仓储)中增删改方法的db.SaveChanges()删除掉,这时候我们就发现好处了吧,那就是我们数据库访问层虽然调用的方法没有真正的保存到数据库里面去,也就是把SaveChanges全部给放到DbSession中去实现了,那么DbSession我们就能够看成一个真正的会话了。
(3)也就是说我们在前面调用了很多次的增删改的实体之后(操作很多表),而只需要去DbSession中调用一个SaveChanges方法,就可以把所有的表实体的变化都放到数据库中去。
3.将SaveChanges方法放到DbSession中好处
(1)那么我们将SaveChanges方法放到DbSession中有什么好处呢?我们再项目中举个例子来说:我们回到BaseService里面拿添加仓储来说,假设我们添加实体这里,我们再上面做了一个添加用户的实体,然后我们业务里面还有修改一个状态,那么我们的代码如下所示:
//实现对数据库的添加功能
public T AddEntity(T entity)
{
//调用T对应的仓储来做添加工作
CurrentRepository.AddEntity(entity);
CurrentRepository.UpdateEntity(entity);
}
(2)在这里我们一个业务场景可能会操作很多个表,在之前的做法中我们所有的增删改方法每调用一次就会执行SaveChanges一次,比如添加用户当我们添加用户就要SaveChangers一次,然后付给权限有需要一次,那这样的话就跟数据库交互了很多次,那么我们就才想到将SaveChangers方法提取到DbSession中去。
(3)如果我们将SaveChangers提取到DbSession中去的话,那么当我们以后操作多个实体之后直接来调用一下DbSession实现,这时候对应的上面的添加的方法即可这样实现:
//DbSession的存放
public DbSession _DbSession = new DbSession();
//基类的构造函数
public BaseService()
{
SetCurrentRepository(); //构造函数里面去调用了,此设置当前仓储的抽象方法
}
public abstract void SetCurrentRepository(); //子类必须实现
//实现对数据库的添加功能
public T AddEntity(T entity)
{
//调用T对应的仓储来做添加工作
CurrentRepository.AddEntity(entity);
CurrentRepository.UpdateEntity(entity);
_DbSession.SaveChanges();
}
(4)这时候我们将DbSession封装的话,这样就使的DbSession非常灵活,就是把SaveChangers的权利从数据库访问层提高到了业务逻辑层,让业务逻辑层来控制SaveChangers方法,而数据库访问层不需要进行SaveChangers方法了,那么就可以保证在一个业务场景中操作多个表只需要一次的提交,减少了跟数据库交互的次数。
4.对BaseService的修改
(1)通过上面的介绍,下面我们来对BaseService进行修改,修改的最终代码如下所示:
namespace LYZJ.UserLimitMVC.BLL
{
public abstract class BaseService<T> where T : class, new()
{
//当前仓储
public IDAL.IBaseRepository<T> CurrentRepository { get; set; }
//DbSession的存放
public DbSession _DbSession = new DbSession();
//基类的构造函数
public BaseService()
{
SetCurrentRepository(); //构造函数里面去调用了,此设置当前仓储的抽象方法
}
public abstract void SetCurrentRepository(); //子类必须实现
//实现对数据库的添加功能
public T AddEntity(T entity)
{
//调用T对应的仓储来做添加工作
var AddEntity = CurrentRepository.AddEntity(entity);
_DbSession.SaveChanges();
return AddEntity;
}
//实现对数据的修改功能
public bool UpdateEntity(T entity)
{
CurrentRepository.UpdateEntity(entity);
return _DbSession.SaveChanges() > ;
}
//实现对数据库的删除功能
public bool DeleteEntity(T entity)
{
CurrentRepository.DeleteEntity(entity);
return _DbSession.SaveChanges() > ;
}
//实现对数据库的查询 --简单查询
public IQueryable<T> LoadEntities(Func<T, bool> whereLambda)
{
return CurrentRepository.LoadEntities(whereLambda);
}
/// <summary>
/// 实现对数据的分页查询
/// </summary>
/// <typeparam name="S">按照某个类进行排序</typeparam>
/// <param name="pageIndex">当前第几页</param>
/// <param name="pageSize">一页显示多少条数据</param>
/// <param name="total">总条数</param>
/// <param name="whereLambda">取得排序的条件</param>
/// <param name="isAsc">如何排序,根据倒叙还是升序</param>
/// <param name="orderByLambda">根据那个字段进行排序</param>
/// <returns></returns>
public IQueryable<T> LoadPageEntities<S>(int pageIndex, int pageSize, out int total, Func<T, bool> whereLambda,
bool isAsc, Func<T, S> orderByLambda)
{
return CurrentRepository.LoadPageEntities(pageIndex, pageSize, out total, whereLambda, isAsc, orderByLambda);
}
}
}
(2) 虽然DbSession封装的很简单,但是它兼顾了简单工厂模式和SaveChangers方法(当前会话比较重要的功能), 虽然SaveChangers方法简单的几行代码,但是我们在这里实现了一个模式,那就是单元工作模式(UintWork)。
(3) 单元工作模式,就是批量的把对数据库的操作提交到数据库中去,就是把一系列对数据库的操作封装成一个单元工作,一次性的把单元工作里面的所有改变都提交到数据库里面去,这就是单元工作模式,它的目的就是为了提高跟数据库交互的效率,减少跟数据库交互的次数。
5.小结
(1)这篇博客在最后我要给出一些博友们在前面给我留言的回答,首先是我写的是权限管理吗?我的回答肯定是的,但是你前面还没有看到那里,那是因为我还在写底层的信息,因为当我们写好底层的时候,那么界面的东西和业务逻辑还不好些吗。
(2)我现在这个项目做的有点复杂,很多人说没有实用价值,我这里要说的也是,我在这篇博客的开头我就说了这个系列的博客不是教大家怎么去做项目,而是说思想,而且我相信,只要我们理解了面向对象的思想,很多问题都会迎刃而解。
(3)最后感谢广大博客阅读我的博客,谢谢大家的支持,你们的支持就是我的动力。
Kencery返回本系列开篇
ASP.NET MVC+EF框架+EasyUI实现权限管理系列(7)-DBSession的封装的更多相关文章
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列
http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开篇 前言:博客又有一段时间没有更新了,心里感觉这段时间空空的,好像什么都没有学下,所以就想写博客,所以就有了这个系列,这里当然也 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(20)-多条件模糊查询和回收站还原的实现 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(19)-用户信息的修改和浏览 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除)
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(18)-过滤器的使用和批量删除数据(伪删除和直接删除) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证)
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(17)-注册用户功能的细节处理(各种验证) ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
随机推荐
- spring mvc综合easyui点击上面菜单栏中的菜单项问题
采用easyui的tree报错发生的背景后,会弹出一个窗口,有一个问题是,当你点击顶部 解决方案,如下面(运用easyui1.36): /home/cyz/workspace/hb_manager ...
- OTN&互换amp; P-OTN有效降低100G 网络成本 (两)
OTN互换& P-OTN有效降低100G 网络成本 (两) 在全球范围内.网流量的增长速度是空前的,导致此现象的缘由包含云服务的增长.移动宽带和基于互联网的视频点播服务的增长. Cisco估计 ...
- ArcPad 10 的安装部署
ArcPad是安装在手持设备或者移动终端的一个外业ArcGIS产品,也就是说ArcPad是Esri的一款软件产品,而不是硬件设备哦.尽管不比ArcGIS Desktop功能复杂缤纷,可是对于野外作业. ...
- Lua中的weak表——weak table(转)
弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...
- 【iOS发展-61】更换plist经过资源,执行iOS一旦数据仍显示在模拟器的外观,如何解决?
(1)案例介绍 --我们首先导入plist文件做项目,模拟的观看效果. --删除plist,更换一个新的plist,CMD+R模拟执行,或者找到该程序界面上显示最后一个数据. (2)原因 是由于第一次 ...
- 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑
课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.
- 创建在SQLServer 和 Oracle的 DBLINK
dblink 当我们要跨本地数据库.訪问另外一个数据库表中的数据时,本地数据库中就必需要创建远程数据库的dblink,通过dblink本地数据库能够像訪问本地数据库一样訪问远程数据库表中的数据. 一 ...
- BZOJ1579 USACO 2009 Feb Gold 3.Revamping Trails Solution
标题效果:一个N积分m无向图边.它可以是路径k右边缘值变0,确定此时1-n最短路径长度. Sol:我以为我们考虑分层图,图复制k+1部分,每间0~k一层.代表在这个时候已经过去"自由边缘&q ...
- 看你的门-攻击服务器(4)-HTTP参数注入攻击
首先需要声明.这纯粹是没有远见和有点真才实学开发一个愚蠢的观点,只为web参考系统安全. 1.HTTP参数注入攻击 參数,被用做后端HTTP请求中的參数,这个时候就有可能会导致HTTP參数注入. 一个 ...
- tomcat配置sqlserver数据库
1. 首先确保Tomcat安装文件夹中的\common\lib(对于Tomcat5.5)或者是\lib(Tomcat6.0)文件夹中已包括JDBC连接数据库所必须的三个.jar文件(msbase.ja ...