码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-14 01:00:27      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   数据   for   

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

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

bubuko.com,布布扣
 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 }
View Code

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

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

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

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

bubuko.com,布布扣
 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 }
View Code

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

bubuko.com,布布扣
 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 }
View Code

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

 

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

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

标签:style   blog   http   color   os   io   数据   for   

原文地址:http://www.cnblogs.com/wanren/p/3911249.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!