ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一
前言:通过上篇博客我们完成了对DbSession的代码编写,DbSession就相当于数据库访问层的入口,只要我们要操作数据库我们就能够从这里进入到数据库,而且能取到所有的实体的对象,这些知识点我在上篇博客基本都已经说了,博友们可以去看看,现在系列已经写到8了,这期间谢谢广大博主的支持和回复,你们的评论将是我学习的动力,希望你们能对我的博客进行评论。这篇博客我们继续来说我们的底层的实现,可能大部分博友们也有点心急,什么时候能见到页面呢,现在快了,当我介绍完TT模版和源代码管理工具之后我们就能够进入到权限的设置,坚持就是胜利。
1. DbSession接口的约束
(1)DbSession就是我们整个数据库访问层的入口,那么我们DbSession也必须由一个接口的约束,那么我们在数据库访问接口层(LYZJ.UserLimitMVC.IDAL类库)加个接口约束,新建接口IDbSession。在IDbSession中有这么几个方法,代码如下:
1 namespace LYZJ.UserLimitMVC.IDAL
2
3 {
4
5 public inte易做图ce IDbSession
6
7 {
8
9 //每个表对应的实体仓储对象
10
11 IDAL.IRoleRepository RoleRepository { get; }
12
13 IDAL.IUserInfoRepository UserInfoRepository { get; }
14
15 //将当前应用程序跟数据库的会话内所有实体的变化更新会数据库
16
17 int SaveChanges();
18
19 //执行Sql语句的方法
20
21 //EF4.0的写法
22
23 //int ExcuteSql(string strSql, ObjectParameter[] parameters);
24
25 //EF5.0的写法
26
27 int ExcuteSql(string strSql, DbParameter[] parameters);
28
29 }
30
31 } (2)首先添加的是每个表对应的实体仓储对象,
(3)添加SaveChanges方法的接口
(4)添加ExcuteSql方法的接口,int ExcuteSql(string strSql,ObjectParameter[] parameters),它的作用就是执行Sql脚本,那么如果我们再数据库接口层添加了接口之后,我们数据库访问层的DbSession就要继承自IDbSession接口,然后实现接口中的所有的方法,那么修改后的DbSession中的代码如下:
1 namespace LYZJ.UserLimitMVC.DAL
2
3 {
4
5 //一次跟数据库交互的会话
6
7 public class DbSession : IDbSession //代表应用程序跟数据库之间的一次会话,也是数据库访问层的统一入口
8
9 {
10
11 public IDAL.IRoleRepository RoleRepository
12
13 {
14
15 get { return new RoleRepository(); }
16
17 }
18
19 public IDAL.IUserInfoRepository UserInfoRepository
20
21 {
22
23 get { return new UserInfoRepository(); }
24
25 }
26
27 //代表:当前应用程序跟数据库的会话内所有的实体的变化,更新会数据库
28
29 public int SaveChanges()
30
31 {
32
33 //调用EF上下文的SaveChanges方法
34
35 return DAL.EFContextFactory.GetCurrentDbContext().SaveChanges();
36
37 }
38
39 //执行Sql脚本的方法
40
41 public int ExcuteSql(string strSql, System.Data.Common.DbParameter[] parameters)
42
43 {
44
45 //Ef4.0的执行方法 ObjectContext
46
47 //封装一个执行SQl脚本的代码
48
49 //return DAL.EFContextFactory.GetCurrentDbContext().ExecuteFunction(strSql, parameters);
50
51 throw new NotImplementedException();
52
53 }
54
55 }
56
57 }2.对EF操作SQL语句的小记
(1)在这里大家如果看我上面代码的话会看到执行SQl语句的方法是个空方法,我想请问大家在EF5.0里面执行SQL语句的方法是什么,我只知道4.0的方法,如果大家知道的话请给我留言,谢谢大家。
(2)我们在使用EF框架的时候也可以跟ADO.NET进行配合,它们之间不是互斥的,我们的项目在某些特殊的功能中还是可以使用ADO.NET来实现的。
3.业务逻辑层DbSession线程内唯一
(1)通过前面的博客我们知道我们将数据库访问层的BaseRepository(仓储)使用简单工厂来实现了线程内唯一的定义,代码如下:
1 //获取的是当前线程内部的上下文实例,而且保证了线程内上下文唯一
2
3 private DbContext db = EFContextFactory.GetCurrentDbContext(); (2)按照上面的说法的话,那么我们的业务逻辑层来获取DbSession的时候也是使用简单工厂来实现线程内唯一,那么我们修改DbSession的定义如下:
1 //DbSession的存放
2
3 public IDbSession _DbSession = DbSessionFactory.GetCurrenntDbSession(); (3)根据(2)里面的代码我们可以看到,这时候我们需要在数据库访问层,也就是(LYZJ.UserLimitMVC.DAL)下面创建一个DbSessionFactory类,我们使用这个类来实现GetCurrentDbSession方法,这样我们的DbSession也就实现了线程内唯一。
(4)那么最后我们实现的DbSessionFactory的代码如下所示,因为在前面我已经介绍过实现线程内唯一了,所以这里就不详细的介绍了,适当的注释一下:代码如下:
1 namespace LYZJ.UserLimitMVC.DAL
2
3 {
4
5 public class DbSessionFactory
6
7 {
8
9 //保证了线程内DbSession实例唯一
10
11 public static IDbSession GetCurrenntDbSession()
12
13 {
14
15 //这里的GetData()方法的key不能和上下文的一样
16
17 IDbSession _dbSession = CallContext.GetData("DbSession") as IDbSession;
18
19 if (_dbSession == null)
20
21 {
22
23 _dbSession = new DbSession();
24
25 //将值设置到数据槽里面去
26
27 CallContext.SetData("DbSession", _dbSession);
28
补充:Web开发 , ASP.Net ,