一步一步搭建开发框架(五)单元工作模式

1,单元工作模式主要为了提高与数据库的交互次数,提高应用程序效率。我们知道实际的业务操作中,有时需要好几张表一快保存,一块删除之类的逻辑,比如注册用户之后,用户表要加一条数据,积分表等与用户表有外键关系的表可能也需要保存数据,这样造成多次保存,也就是多次与数据库交互。

2,前边我把SaveChange()方法都写到了BaseDal里面,今晚上就把这个SaveChange方法提取出来!我们继续封装一个DbSession类,同时将抽象工厂的代码转移到这个DbSession类中。

 1 namespace PCITC.OA.DalFactory
 2 {
 3     public class DbSession
 4     {
 5         private static string assemblyName = ConfigurationManager.AppSettings["Assembly"].ToString();
 6         private static string spaceName = ConfigurationManager.AppSettings["NameSpace"].ToString();
 7         public static object GetInstance(string assemblyName, string typeName)
 8         {
 9             return Assembly.Load(assemblyName).CreateInstance(typeName);
10         }
11         public IUserInforDal UserInforDal
12         {
13             get
14             {
15                 return GetInstance(assemblyName, string.Format("{0}.{1}", spaceName, "UserInforDal")) as IDal.IUserInforDal;
16             }
17         }
18         public IRoleDal RoleDal
19         {
20             get
21             {
22                 return GetInstance(assemblyName, string.Format("{0}.{1}", spaceName, "RoleDal")) as IDal.IRoleDal;
23             }
24         }
25         public int SaveChange()
26         {
27             DbContext dbContext = EFDBContextFactory.GetCurrentDbContext();
28             return dbContext.SaveChanges();
29         }
30
31     }
32 }

从代码上可以看到,SaveChange()方法写在了DbSession类中,在上一篇博客中已经对EF上下文实例进行了管理,所以SaveChange方法中的上下文对象就是我们当前线程中的上下文对象,通过在业务逻辑层由我们自己控制什么时候业务逻辑处理完成,什么时候调用SaveChange方法。做到批量提交的效果。

3,SaveChange方法被调用时会启动一个事务,一条保存失败,所有数据都保存失败。所以,我们就可以将BaseDal中的SaveChange方法全部删除,在业务逻辑层根据Savechange的结果,自己判断是否保存成功。

4,还有个问题,由于DbSession中封装了所有的Dal,所以DbSession的实例也要维护一下,否则如果创建多个DbSession类的话,会造成大量Dal实例的创建,同时由于获取Dal的实例是通过反射获取的,如果不维护一下,会造成大量性能的浪费!

5,DbSession类线程内实例唯一。通过简单工厂和CallContext类实现,与EF上下文实例管理类似。

 1 namespace PCITC.OA.DalFactory
 2 {
 3     public class DbSessionFactory
 4     {
 5         public static IDal.IDbSession GetCurrentDbSession()
 6         {
 7             IDal.IDbSession dbSession = (IDal.IDbSession)CallContext.GetData("DbSession");
 8             if (dbSession==null)
 9             {
10                 dbSession = new DbSession();
11                 CallContext.SetData("DbSession",dbSession);
12             }
13             return dbSession;
14         }
15     }
16 }

6,这个时候业务逻辑层获取DbSession类的代码就变成了:

 1 namespace PCITC.OA.Bll
 2 {
 3     public class UserInforService
 4     {
 5         private IDbSession dbSession = DbSessionFactory.GetCurrentDbSession();
 6         public UserInfor Add(UserInfor userInfor)
 7         {
 8             return dbSession.UserInforDal.Add(userInfor);
 9         }
10     }
11 }

到此:数据库访问层的代码基本处理完成!

一步一步搭建开发框架(五)单元工作模式,布布扣,bubuko.com

时间: 2024-12-30 22:16:19

一步一步搭建开发框架(五)单元工作模式的相关文章

.Net普通三层->工厂模式->线程内唯一+单元工作模式->WebService分布式三层

在软件世界分层的思想无处不在 主要是为了提高软件系统的维护性,扩展性,复用性和解耦等 软件的三层构架是一种最基本的分层思想的体现 结构图大体如下: 如此一来,开发人员可以只关注其中一层,而无需关心下一层是如何实现的 但是最基本的三层构架在软件系统中很明显是不够用的 因为它带来优点的同时也带着许多缺点,比如耦合性高,经常出现修改某一层的代码另外一层也要随之大幅度整顿 而且当需求发生改变的时候,如:原先开发的时候使用mssql数据库,而现在又要求更换成mysql数据库 更换Dal层会导致Bll层也要

.Net普通三层 到 工厂模式->线程内唯一+单元工作模式->WebService分布式三层

在软件世界分层的思想无处不在 主要是为了提高软件系统的维护性,扩展性,复用性和解耦等 软件的三层构架是一种最基本的分层思想的体现 结构图大体如下: 如此一来,开发人员可以只关注其中一层,而无需关心下一层是如何实现的 但是最基本的三层构架在软件系统中很明显是不够用的 因为它带来优点的同时也带着许多缺点,比如耦合性高,经常出现修改某一层的代码另外一层也要随之大幅度整顿 而且当需求发生改变的时候,如:原先开发的时候使用mssql数据库,而现在又要求更换成mysql数据库 更换Dal层会导致Bll层也要

ASP.NET Mvc实用框架(一)Ioc、仓储模式和单元工作模式

Framework.EF 首先看一下这个类库: Extended文件夹存放的是EntityFramework.Extensions这个插件的源代码,没有别的原因,就是本人觉得这个插件挺好的,每次省的下载而已 IDependency:用于依赖注入的接口 IRepository和Repository:用于仓储模式 IUnitOfWork和UnitOfWork:用于单元工作模式 Page:分页实体 1.什么是依赖注入? 记得第一次接触依赖注入的时候是在我大二暑假自己出去实习的时候,当时带我的人让我看一

rabbitmq的五种工作模式

abbitmq的五种工作模式 原文地址:https://www.cnblogs.com/Jeely/p/10784172.html

RabbitMQ五种工作模式学习总结

一.简介最近,在看一些消息中间件的内容,之前都没有好好学习一下消息中间件.本文将对RabbitMQ中五种常用的工作模式做一个简单的介绍和总结.RabbitMQ常用的工作模式有:简单队列模式.工作队列模式.发布订阅模式.路由模式.主题模式.本文参照RabbitMQ官网示例总结,详细可以到官网查看:https://www.rabbitmq.com/getstarted.html. 二.简单队列模式(Simple Queue) [a]模型图:只包含一个生产者以及一个消费者,生产者Producer将消息

消息队列rabbitmq的五种工作模式(go语言版本)

前言:如果你对rabbitmq基本概念都不懂,可以移步此篇博文查阅消息队列RabbitMQ 一.单发单收 二.工作队列Work Queue 三.发布/订阅 Publish/Subscribe 四.路由Routing 五.Topic类型的exchange 六.rabbitmq部分封装代码及装备工作 一.单发单收 在下图中,“ P”是我们的生产者,“ C”是我们的消费者.中间的框是一个队列-RabbitMQ代表使用者保留的消息缓冲区. 单发单收模式下:一发一收 发送端只需要创建队列,然后向队列发送消

一步一步搭建开发框架(一)依赖抽象编程

1,从一开始学.NET变学了最简单的框架,三层框架,多层框架应用的也比较广泛.自从从事SharePoint开发以后,对.NET方面的知识都渐渐的遗忘了,ASP.NET和ASP.NET MVC也感觉越来越陌生,但一直感觉框架很优美,设计的很合理.晚上无聊的时候还是学一下!本来有一些疑惑的地方,写一写博客,从头到尾缕一遍,也会特别清晰! 2,常见的三层框架Dal层,Bll层,UI层! 3,(1)第一种变化:现在有这么一种情况,Dal层和数据库连接有可能用ORM框架,也有可能使用原生的ADO.NET!

一步一步搭建开发框架(三)基类基接口

1,AdoNetDal和EfDal都实现IDal这个接口,公共的方法写到接口中,接口中的代码! 1 namespace PCITC.OA.IDal 2 { 3 public interface IUserInforDal 4 { 5 UserInfor Add(UserInfor userInfor); 6 7 bool Update(UserInfor userInfor); 8 9 bool Delete(UserInfor userInfor); 10 11 int Delete(para

一步一步搭建开发框架(二)工厂模式

1,从(一)说起,面对程序中很有地方都用到Dal层的实例,我们想到了,将创建实例写到一个单独的方法中,由这个方法来维护实例的变化,这样,当需要更改实例的时候,我们只需要更改一下这个方法即可,而不必在程序中到处修改!因此便有了简单工厂. 1 namespace PCITC.OA.DalFactory 2 { 3 public class DalFactory 4 { 5 public static IDal.IUserInforDal GetUserInforDal() 6 { 7 return