标签:style blog http color os io 数据 for
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
标签:style blog http color os io 数据 for
原文地址:http://www.cnblogs.com/wanren/p/3911249.html