DBSession是一个数据库会话层,在BLL层和DAL层之间,作用:解耦BLL层与DAL层的关系,BLL层通过调用接口来完成相关的数据操作,这里只有一个数据库访问技术就是用EF,如果除了EFDAL还有一个SQLDAL,有一天老板突然让你把EFDAL换成SQLDAL实现同样的功能,那怎么办?
最好的,最偷懒的方法就是我们把写好的SQLDAL和IDAL层的接口定义的方法一致,让SQLDAL里面的类同样实现IDAL里面的接口,这样就不用去改代码而是增加代码而已,原来的代码还能用,如果有一天老板又让你换回来,而你把原来的修改了,那不是还要再写一遍…… 很麻烦
但是写好了SQLDAL就会发现有个问题,比如IUserInfoDAL它有两个子类,一个用EF实现的UserInfoDAL(UserInfoEFDAL),另一个用SQL实现的UserInfoSQLDAL,在BLL层调用的时候是这样调用的IUserInfoDAL userInfoDAL=new UserInfoEFDAL();然后userInfoDAL.什么,如果要使用SQLDAL里面的UserInfoSQLDAL就要把这个代码换成IUserInfoDAL userInfoDAL=new UserInfoSQLDAL();一两个这样的调用没什么,改的代码不多,但是如果有几百个,几千个改起来也会累死,更何况万一还要用回EFDAL呢!!!所以我们定义一个DBSession类
1 using DAL; 2 using IDAL; 3 using Model; 4 using System; 5 using System.Collections.Generic; 6 using System.Data.Entity; 7 using System.Linq; 8 using System.Text; 9 using System.Threading.Tasks; 10 11 namespace DALFactory 12 { 13 /// <summary> 14 /// DBSession:工厂类(数据会话层),作用创建数据操作类实例,业务层通过DBSession调用相应的实例,使数据层与业务层解耦 15 /// </summary> 16 public class DBSession:IDBSession 17 { 18 private IUserInfoDAL UserInfoDAL; 19 20 public IUserInfoDAL userInfoDAL 21 { 22 get 23 { 24 if (UserInfoDAL == null) 25 { 26 UserInfoDAL = new UserInfoEFDAL(); 27 //UserInfoDAL = new UserInfoSQLDAL(); 28 } 29 return UserInfoDAL; 30 } 31 set { UserInfoDAL = value; } 32 } 33 private IStuAnsDAL StuAnsDAL; 34 public IStuAnsDAL stuAnsDAL 35 { 36 get 37 { 38 if (StuAnsDAL == null) 39 { 40 StuAnsDAL = new StuAnsEFDAL(); 41 //StuAnsDAL = new StuAnsSQLDAL(); 42 } 43 return StuAnsDAL; 44 } 45 set { StuAnsDAL = value; } 46 } 47 } 48 } 49
原文:http://www.cnblogs.com/lvshijian-1994/p/4877087.html