ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一

简介: 原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一   ASP.NET MVC+EF框架+EasyUI实现权限管系列       (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4...
原文: ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一

   ASP.NET MVC+EF框架+EasyUI实现权限管系列

  

   (开篇)   (1):框架搭建    (2):数据库访问层的设计Demo    (3):面向接口编程   (4 ):业务逻辑层的封装 

   (5):前台Jquery easyUI实现    (6):EF上下文实例管理    (7):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 interface 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 
29             }
30 
31             return _dbSession;
32 
33         }
34 
35     }
36 
37 }

  (5)在这里要注意的是我们什么时候使用简单工厂,什么时候使用new?那就是我们的实例的生命周期的时候,我们要进行控制他,如果我们不控制的话那么我们直接使用new即可。比如我们的表实体我们如果想创建的话,那么我们直接new一个就可以了,而不需要去创建一个简单工厂。

4.小结

  (1)这篇Demo的底层框架我们到这里就实现完了,今天写的比较少,因为只有实现了一个知识点,那就是对DbSession的线程内唯一的访问。明天开始我将继续写如何使用T4模版和源代码管理工具,当介绍完这些的时候,我就会正式开始介绍权限系统。谢谢大家的支持

  (2)这里因为底层的东西基本也就这些东西了,后面的东西都是在这些基础上面进行扩展,所以现在看整个系统的架构如图所示:

      

  

  Kencery返回本系列开篇

  

目录
相关文章
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
38 0
|
28天前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界
27 0
|
1月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
95 5
|
5月前
|
开发框架 自然语言处理 前端开发
基于ASP.NET MVC开发的、开源的个人博客系统
基于ASP.NET MVC开发的、开源的个人博客系统
51 0
|
5月前
|
自然语言处理 监控 API
一款.Net7前后端分离、跨平台的通用权限管理框架
一款.Net7前后端分离、跨平台的通用权限管理框架
38 0
|
8月前
|
SQL 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(完:内附源码)
经过一段时间的准备,【ASP.NET Core MVC开发实战之商城系统】已经完成,目前代码已开发完成,先将全部内容整理分享,如有不足之处,还请指正。
106 0
|
8月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(六)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情,购物车等功能的开发,今天继续讲解订单管理功能开发,仅供学习分享使用,如有不足之处,还请指正。
214 0
|
8天前
|
存储 Java 数据库连接
java多线程之线程通信
java多线程之线程通信
|
20天前
|
存储 缓存 NoSQL
Redis单线程已经很快了6.0引入多线程
Redis单线程已经很快了6.0引入多线程
31 3
|
22天前
|
消息中间件 安全 Linux
线程同步与IPC:单进程多线程环境下的选择与权衡
线程同步与IPC:单进程多线程环境下的选择与权衡
57 0