在之前的文章中,我们已经搭好了三层框架,通过调用业务层的子接口得到实例化的业务子类,通过业务子类来调用数据访问层子接口,由子接口来实例化数据访问层子类。这里我们需要明确把框架搭这么复杂的原因是遵循了设计模式中的开闭原则:对扩展开放,对修改关闭。
搭好了框架之后,我们发现这框架并不完善:实例化对象还需要手动实现,并不能实现将对象的实例化托管。所以我们决定引入spring.net框架,它的IOC模块(依赖注入),将帮我们来完成对象的创建,管理。
1、首先我们需要在项目中引用spring.core.dll、Common.Logging.dll这两个程序集。引用完毕后,我们来对项目框架进行修改。先从最底层的数据访问层出发:为了方便统一管理对象,我们创建一个DBSession工厂类,用来统一对类进行实例化,代码如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using IDAL; 6 7 namespace DAL 8 { 9 public partial class DBSession:IDAL.IDBSession 10 { 11 #region 01 数据接口 IsysdiagramsDAL 12 IsysdiagramsDAL isysdiagramsDAL; 13 public IsysdiagramsDAL IsysdiagramsDAL 14 { 15 get 16 { 17 if(isysdiagramsDAL==null) 18 isysdiagramsDAL= new sysdiagramsDAL(); 19 return isysdiagramsDAL; 20 } 21 set 22 { 23 isysdiagramsDAL= value; 24 } 25 } 26 #endregion 27 28 #region 02 数据接口 IT001账号表DAL 29 IT001账号表DAL iT001账号表DAL; 30 public IT001账号表DAL IT001账号表DAL 31 { 32 get 33 { 34 if(iT001账号表DAL==null) 35 iT001账号表DAL= new T001账号表DAL(); 36 return iT001账号表DAL; 37 } 38 set 39 { 40 iT001账号表DAL= value; 41 } 42 } 43 #endregion 44 45 #region 03 数据接口 IT002验证表DAL 46 IT002验证表DAL iT002验证表DAL; 47 public IT002验证表DAL IT002验证表DAL 48 { 49 get 50 { 51 if(iT002验证表DAL==null) 52 iT002验证表DAL= new T002验证表DAL(); 53 return iT002验证表DAL; 54 } 55 set 56 { 57 iT002验证表DAL= value; 58 } 59 } 60 #endregion 61 62 #region 04 数据接口 IT003用户角色表DAL 63 IT003用户角色表DAL iT003用户角色表DAL; 64 public IT003用户角色表DAL IT003用户角色表DAL 65 { 66 get 67 { 68 if(iT003用户角色表DAL==null) 69 iT003用户角色表DAL= new T003用户角色表DAL(); 70 return iT003用户角色表DAL; 71 } 72 set 73 { 74 iT003用户角色表DAL= value; 75 } 76 } 77 #endregion 78 79 #region 05 数据接口 IT004社团信息表DAL 80 IT004社团信息表DAL iT004社团信息表DAL; 81 public IT004社团信息表DAL IT004社团信息表DAL 82 { 83 get 84 { 85 if(iT004社团信息表DAL==null) 86 iT004社团信息表DAL= new T004社团信息表DAL(); 87 return iT004社团信息表DAL; 88 } 89 set 90 { 91 iT004社团信息表DAL= value; 92 } 93 } 94 #endregion 95 96 #region 06 数据接口 IT005票务表DAL 97 IT005票务表DAL iT005票务表DAL; 98 public IT005票务表DAL IT005票务表DAL 99 { 100 get 101 { 102 if(iT005票务表DAL==null) 103 iT005票务表DAL= new T005票务表DAL(); 104 return iT005票务表DAL; 105 } 106 set 107 { 108 iT005票务表DAL= value; 109 } 110 } 111 #endregion 112 113 #region 07 数据接口 IT006店铺信息表DAL 114 IT006店铺信息表DAL iT006店铺信息表DAL; 115 public IT006店铺信息表DAL IT006店铺信息表DAL 116 { 117 get 118 { 119 if(iT006店铺信息表DAL==null) 120 iT006店铺信息表DAL= new T006店铺信息表DAL(); 121 return iT006店铺信息表DAL; 122 } 123 set 124 { 125 iT006店铺信息表DAL= value; 126 } 127 } 128 #endregion 129 130 #region 08 数据接口 IT007店铺货物表DAL 131 IT007店铺货物表DAL iT007店铺货物表DAL; 132 public IT007店铺货物表DAL IT007店铺货物表DAL 133 { 134 get 135 { 136 if(iT007店铺货物表DAL==null) 137 iT007店铺货物表DAL= new T007店铺货物表DAL(); 138 return iT007店铺货物表DAL; 139 } 140 set 141 { 142 iT007店铺货物表DAL= value; 143 } 144 } 145 #endregion 146 147 #region 09 数据接口 IT008海报信息表DAL 148 IT008海报信息表DAL iT008海报信息表DAL; 149 public IT008海报信息表DAL IT008海报信息表DAL 150 { 151 get 152 { 153 if(iT008海报信息表DAL==null) 154 iT008海报信息表DAL= new T008海报信息表DAL(); 155 return iT008海报信息表DAL; 156 } 157 set 158 { 159 iT008海报信息表DAL= value; 160 } 161 } 162 #endregion 163 164 #region 10 数据接口 IT009社团账号表DAL 165 IT009社团账号表DAL iT009社团账号表DAL; 166 public IT009社团账号表DAL IT009社团账号表DAL 167 { 168 get 169 { 170 if(iT009社团账号表DAL==null) 171 iT009社团账号表DAL= new T009社团账号表DAL(); 172 return iT009社团账号表DAL; 173 } 174 set 175 { 176 iT009社团账号表DAL= value; 177 } 178 } 179 #endregion 180 181 } 182 183 }
数据访问层有了统一的对象管理工厂,自然业务逻辑层也需要:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using IBLL; 6 7 namespace BLL 8 { 9 public partial class BLLSession:IBLLSession 10 { 11 #region 01 业务接口 IsysdiagramsBLL 12 IsysdiagramsBLL isysdiagramsBLL; 13 public IsysdiagramsBLL IsysdiagramsBLL 14 { 15 get 16 { 17 if(isysdiagramsBLL==null) 18 isysdiagramsBLL= new sysdiagramsBLL(); 19 return isysdiagramsBLL; 20 } 21 set 22 { 23 isysdiagramsBLL= value; 24 } 25 } 26 #endregion 27 28 #region 02 业务接口 IT001账号表BLL 29 IT001账号表BLL iT001账号表BLL; 30 public IT001账号表BLL IT001账号表BLL 31 { 32 get 33 { 34 if(iT001账号表BLL==null) 35 iT001账号表BLL= new T001账号表BLL(); 36 return iT001账号表BLL; 37 } 38 set 39 { 40 iT001账号表BLL= value; 41 } 42 } 43 #endregion 44 45 #region 03 业务接口 IT002验证表BLL 46 IT002验证表BLL iT002验证表BLL; 47 public IT002验证表BLL IT002验证表BLL 48 { 49 get 50 { 51 if(iT002验证表BLL==null) 52 iT002验证表BLL= new T002验证表BLL(); 53 return iT002验证表BLL; 54 } 55 set 56 { 57 iT002验证表BLL= value; 58 } 59 } 60 #endregion 61 62 #region 04 业务接口 IT003用户角色表BLL 63 IT003用户角色表BLL iT003用户角色表BLL; 64 public IT003用户角色表BLL IT003用户角色表BLL 65 { 66 get 67 { 68 if(iT003用户角色表BLL==null) 69 iT003用户角色表BLL= new T003用户角色表BLL(); 70 return iT003用户角色表BLL; 71 } 72 set 73 { 74 iT003用户角色表BLL= value; 75 } 76 } 77 #endregion 78 79 #region 05 业务接口 IT004社团信息表BLL 80 IT004社团信息表BLL iT004社团信息表BLL; 81 public IT004社团信息表BLL IT004社团信息表BLL 82 { 83 get 84 { 85 if(iT004社团信息表BLL==null) 86 iT004社团信息表BLL= new T004社团信息表BLL(); 87 return iT004社团信息表BLL; 88 } 89 set 90 { 91 iT004社团信息表BLL= value; 92 } 93 } 94 #endregion 95 96 #region 06 业务接口 IT005票务表BLL 97 IT005票务表BLL iT005票务表BLL; 98 public IT005票务表BLL IT005票务表BLL 99 { 100 get 101 { 102 if(iT005票务表BLL==null) 103 iT005票务表BLL= new T005票务表BLL(); 104 return iT005票务表BLL; 105 } 106 set 107 { 108 iT005票务表BLL= value; 109 } 110 } 111 #endregion 112 113 #region 07 业务接口 IT006店铺信息表BLL 114 IT006店铺信息表BLL iT006店铺信息表BLL; 115 public IT006店铺信息表BLL IT006店铺信息表BLL 116 { 117 get 118 { 119 if(iT006店铺信息表BLL==null) 120 iT006店铺信息表BLL= new T006店铺信息表BLL(); 121 return iT006店铺信息表BLL; 122 } 123 set 124 { 125 iT006店铺信息表BLL= value; 126 } 127 } 128 #endregion 129 130 #region 08 业务接口 IT007店铺货物表BLL 131 IT007店铺货物表BLL iT007店铺货物表BLL; 132 public IT007店铺货物表BLL IT007店铺货物表BLL 133 { 134 get 135 { 136 if(iT007店铺货物表BLL==null) 137 iT007店铺货物表BLL= new T007店铺货物表BLL(); 138 return iT007店铺货物表BLL; 139 } 140 set 141 { 142 iT007店铺货物表BLL= value; 143 } 144 } 145 #endregion 146 147 #region 09 业务接口 IT008海报信息表BLL 148 IT008海报信息表BLL iT008海报信息表BLL; 149 public IT008海报信息表BLL IT008海报信息表BLL 150 { 151 get 152 { 153 if(iT008海报信息表BLL==null) 154 iT008海报信息表BLL= new T008海报信息表BLL(); 155 return iT008海报信息表BLL; 156 } 157 set 158 { 159 iT008海报信息表BLL= value; 160 } 161 } 162 #endregion 163 164 #region 10 业务接口 IT009社团账号表BLL 165 IT009社团账号表BLL iT009社团账号表BLL; 166 public IT009社团账号表BLL IT009社团账号表BLL 167 { 168 get 169 { 170 if(iT009社团账号表BLL==null) 171 iT009社团账号表BLL= new T009社团账号表BLL(); 172 return iT009社团账号表BLL; 173 } 174 set 175 { 176 iT009社团账号表BLL= value; 177 } 178 } 179 #endregion 180 181 } 182 183 }
有了俩个统一管理的工厂类之后,我们就可以来实现对象实例化的托管了,由于在实际调用时是调用业务逻辑层的子接口,由它返回一个具体的业务逻辑层的对象,我们现在通过spring来实现它(新建一个helper类用来通过配置文件以反射的机制获取一个业务子对象):
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace ClassLibrary 8 { 9 public class Helper 10 { 11 12 public static IBLL.IBLLSession BLLSession = DI.SpringHelper.GetObject("BLLSession"); 13 14 } 15 }
相应的springHelper的代码:
1 using Spring.Context; 2 using Spring.Context.Support; 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Text; 7 8 namespace DI 9 { 10 public class SpringHelper 11 { 12 #region 1.0 Spring容器上下文 -IApplicationContext SpringContext 13 ///14 /// Spring容器上下文 15 /// 16 private static IApplicationContext SpringContext 17 { 18 get 19 { 20 21 return ContextRegistry.GetContext(); 22 23 } 24 } 25 #endregion 26 27 #region 2.0 获取配置文件 配置的 对象 +T GetObject (string objName) where T : class 28 /// 29 /// 获取配置文件 配置的 对象 30 /// 31 /// 32 /// 33 /// 34 public static T GetObject (string objName) where T : class 35 { 36 return (T)SpringContext.GetObject(objName); 37 } 38 #endregion 39 } 40 }
这样我们通过反射机制能拿到一个业务对象了,接下来再业务层中调用数据访问层的子接口,我们需要根据上一篇文章做一些修改:
附上修改BaseBLL后的代码:
using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace BLL { public abstract class BaseBLL: IBLL.IBaseBLL where T : class,new() { public BaseBLL() { SetDAL(); } //定义数据操作层父接口类 //protected DAL.BaseDAL idal; //= new DAL.BaseDAL(); protected IDAL.IBaseDALidal; /// /// 由子类实现,为 业务父类 里的 数据接口对象 设置 值! /// public abstract void SetDAL(); private IDAL.IDBSession iDbSession; #region 数据仓储 属性 + IDBSession DBSession /// /// 数据仓储 属性 /// public IDAL.IDBSession DBSession { get { if (iDbSession == null) { //根据配置文件内容 使用 DI层里的Spring.Net 创建 DBSessionFactory 工厂对象 IDAL.IDBSessionFactory sessionFactory = DI.SpringHelper.GetObject ("DBSessionFactory"); //通过 工厂 创建 DBSession对象 iDbSession = sessionFactory.GetDBSession(); } return iDbSession; } } #endregion //2,定义增删改查的方法 //2.增删改查方法 #region 1.0 新增 实体 +int Add(T model) /// /// 新增 实体 /// /// /// public int Add(T model) { return idal.Add(model); } #endregion #region 2。0 根据 用户 id 删除 +int Del(int uId) /// /// 根据 用户 id 删除 /// /// /// public int Del(T model) { return idal.Del(model); } #endregion #region 3.0 根据条件删除 +int DelBy(Expression > delWhere) /// /// 3.0 根据条件删除 /// /// /// public int DelBy(Expression bool>> delWhere) { return idal.DelBy(delWhere); } #endregion #region 4.0 修改 +int Modify(T model, params string[] proNames) /// /// 4.0 修改,如: /// /// 要修改的实体对象 /// 要修改的 属性 名称 /// public int Modify(T model, params string[] proNames) { return idal.Modify(model, proNames); } #endregion #region 4.0 批量修改 +int Modify(T model, Expression > whereLambda, params string[] modifiedProNames) /// /// 4.0 批量修改 +int Modify(T model, Expression > whereLambda, params string[] modifiedProNames) /// /// /// /// /// public int ModifyBy(T model, Expression bool>> whereLambda, params string[] modifiedProNames) { return idal.ModifyBy(model, whereLambda, modifiedProNames); } #endregion #region 5.0 根据条件查询 +List GetListBy(Expression > whereLambda) /// /// 5.0 根据条件查询 +List GetListBy(Expression > whereLambda) /// /// /// public List GetListBy(Expression bool>> whereLambda) { return idal.GetListBy(whereLambda); } #endregion #region 5.1 根据条件 排序 和查询 + List GetListBy /// /// 5.1 根据条件 排序 和查询 /// /// 排序字段类型 /// 查询条件 lambda表达式 /// 排序条件 lambda表达式 /// public List GetListBy (Expression bool>> whereLambda, Expression > orderLambda) { return idal.GetListBy(whereLambda, orderLambda); } #endregion #region 6.0 分页查询 + List GetPagedList /// /// 6.0 分页查询 + List GetPagedList /// /// 页码 /// 页容量 /// 条件 lambda表达式 /// 排序 lambda表达式 /// public List GetPagedList (int pageIndex, int pageSize, Expression bool>> whereLambda, Expression > orderBy) { return idal.GetPagedList(pageIndex, pageSize, whereLambda, orderBy); } #endregion } }
可以看出,主要是在BaseBLL中加了一个数据访问层仓储的属性,并且通过spring.net给它赋值,得到了这个仓储之后,需要更改一下业务子类中的setDAL()方法:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Linq.Expressions; 6 using IBLL; 7 using IDAL; 8 namespace BLL 9 { 10 public partial class sysdiagramsBLL: BaseBLL,IsysdiagramsBLL 11 { 12 public override void SetDAL() 13 { 14 idal = DBSession.IsysdiagramsDAL; 15 } 16 } 17 public partial class T001账号表BLL: BaseBLL ,IT001账号表BLL 18 { 19 public override void SetDAL() 20 { 21 idal = DBSession.IT001账号表DAL; 22 } 23 } 24 public partial class T002验证表BLL: BaseBLL ,IT002验证表BLL 25 { 26 public override void SetDAL() 27 { 28 idal = DBSession.IT002验证表DAL; 29 } 30 } 31 public partial class T003用户角色表BLL: BaseBLL ,IT003用户角色表BLL 32 { 33 public override void SetDAL() 34 { 35 idal = DBSession.IT003用户角色表DAL; 36 } 37 } 38 public partial class T004社团信息表BLL: BaseBLL ,IT004社团信息表BLL 39 { 40 public override void SetDAL() 41 { 42 idal = DBSession.IT004社团信息表DAL; 43 } 44 } 45 public partial class T005票务表BLL: BaseBLL ,IT005票务表BLL 46 { 47 public override void SetDAL() 48 { 49 idal = DBSession.IT005票务表DAL; 50 } 51 } 52 public partial class T006店铺信息表BLL: BaseBLL ,IT006店铺信息表BLL 53 { 54 public override void SetDAL() 55 { 56 idal = DBSession.IT006店铺信息表DAL; 57 } 58 } 59 public partial class T007店铺货物表BLL: BaseBLL ,IT007店铺货物表BLL 60 { 61 public override void SetDAL() 62 { 63 idal = DBSession.IT007店铺货物表DAL; 64 } 65 } 66 public partial class T008海报信息表BLL: BaseBLL ,IT008海报信息表BLL 67 { 68 public override void SetDAL() 69 { 70 idal = DBSession.IT008海报信息表DAL; 71 } 72 } 73 public partial class T009社团账号表BLL: BaseBLL ,IT009社团账号表BLL 74 { 75 public override void SetDAL() 76 { 77 idal = DBSession.IT009社团账号表DAL; 78 } 79 } 80 }
最后,别忘了在web.config中注册spring.net:
12 3 4 5 12"entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 6 "log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 7 "spring"> 8 11"context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> 9 "objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/> 10 13 2714 15 19 21"config://spring/objects" /> 20 "http://www.springframework.net"> 22 <object id="BLL" type="BLL.T001账号表BLL" singleton="false">object> 23 <object id="BLLSession" type="BLL.BLLSession,BLL" singleton="false">object> 24 <object id="DBSessionFactory" type="DAL.DBSessionFactory,DAL" singleton="false" >object> 25 26
这样,我们就完成了我们整个项目框架的搭建,spring.net+工厂模式。UI层的调用示例如下:
var t001 = operateContext.BLLSession.IT001账号表BLL.GetListBy(m => m.Email ==“....”)[0];
总结:
我们是在原来的三层框架上做了一个改进,将类的所有实现交给一个工厂去完成,而为了得到这个工厂的实例,我们使用了spring.net的IOC模块,通过读取配置文件动态获得对象。