1.1.1 抽象工厂封装数据操作类实例创建,然后DBSession调用抽象工厂,修改DBSession
CZBK.ItcastOA.DALFactory数据会话层调数据层不能直接new,要封装一下解耦
1.2.1 CZBK.ItcastOA.DALFactory 新增抽象工厂类 AbstractFactory
1.2.2 Web.config中配置一下配置信息(数据层的程序集和命名空间)
<!--配置程序集名称和命名空间名称-->
<add key="AssemblyPath" value="CZBK.ItcastOA.DAL" />
<add key="NameSpace" value="CZBK.ItcastOA.DAL" />
1.2.3 引入 System.configuration,因为要读取配置信息
1.2.4 抽象工厂类 AbstractFactory代码
/// <summary> /// 通过反射的形式创建类的实例 /// </summary> public class AbstractFactory { //读取配置的程序集和命名空间 private static readonly string AssemblyPath = ConfigurationManager.AppSettings["AssemblyPath"]; private static readonly string NameSpace = ConfigurationManager.AppSettings["NameSpace"]; public static IUserInfoDal CreateUserInfoDal() { string fullClassName = NameSpace + ".UserInfoDal"; return CreateInStance(fullClassName) as IUserInfoDal;//把反射封装在这个方法里 } private static object CreateInStance(string className) { //加载程序集 var assembly = Assembly.Load(AssemblyPath); return assembly.CreateInstance(className); } }
1.2.5 通过抽象工厂封装了类的实例的创建
1.2.6 这样就完全解耦了,以后不管换成什么DAL,只要更改配置文件就行
1.3.1 各个会话层都是通过接口来调用,所以数据会话层也需要一个接口
面向接口编程,通过这种方式来解耦
IDAL添加一个接口IDBSession
首先IDAL也要引用一下EF,通过添加实体数据模型引用
/// <summary> /// 业务层调用的是数据会话层的接口 /// </summary> public interface IDBSession { DbContext Db { get; } IUserInfoDal UserInfoDal { get; set; } bool SaveChanges(); }
1.3.2 让DBSession继承IDBSession
/// <summary> /// 1.数据会话层:就是一个工厂类,负责完成所有数据操作类实例的创建,然后业务层通过数据会话层来获取要操作数据类的实例, /// 所以数据会话层将业务层和数据层解耦。 /// 2.在数据会话层中提供一个方法:完成所有数据的保存。 /// </summary> public class DBSession:IDBSession { //OAEntities Db = new OAEntities(); public DbContext Db { get { return DBContextFactory.CreateDbContext(); } } private IUserInfoDal _UserInfoDal; public IUserInfoDal UserInfoDal { get { if(_UserInfoDal==null) { //_UserInfoDal= new UserInfoDal(); //通过抽象工厂封装了类的实例的创建 _UserInfoDal = AbstractFactory.CreateUserInfoDal(); } return _UserInfoDal; } set { _UserInfoDal = value; } } /// <summary> /// 一个业务中经常涉及到对多张表的操作,我们希望连接一次数据库,完成对这张表数据的操作,提高性能 /// 工作单元模式 /// </summary> /// <returns></returns> public bool SaveChanges() { return Db.SaveChanges() > 0; } }