关于引擎的设计
看了下大家引擎的代码,总感觉比较臃肿。现在做了如下修改,希望对大家设计引擎有帮助。
首先对BLL层进行了改动,修改为CSMS2.Mould。这里包含所有与业务相关的表。但Mould中的类是已聚合(一次增删改数据的最小单位)作为最小单位。也就是说一些主表和子表被放在了一个聚合中。另外引擎中的表的操作也放在了Mould中,并没有把这些表的操作单独放在引擎中。结构如下:
如果这些聚合之间有相互的操作,且是在一个引擎中的。则需要调用引擎,如果涉及到多个引擎之间的调用,则需要使用引擎调度。
也就是说引擎是一系列表的相互操作,哪些表属于某个引擎,可以由引擎开发人员做的时候确定。
下面看个刚才写的聚合和引擎的例子
新装业务聚合:
//********************************************************************************// //创建日期:<创建日期,2013-2-19> //创建作者:<张易,zhangyi@shanghai3h.com> //功能说明:新装业务 //********************************************************************************// using System; using CSMS2.Application.DTO.MinBanYW; using CSMS2.DataAccess.MinBanYW; using CSMS2.Entity; using CSMS2.Infrastructure.DataType; using Oracle.DataAccess.Client; namespace CSMS2.Mould.MinBanYW { /// <summary> /// 新装业务,包括新装业务和新装审核资料 /// </summary> public class XinZhuangYW { #region 变量 private static MB_XINZHUANGYWProcess _MB_XINZHUANGYWProcess = new MB_XINZHUANGYWProcess(); #endregion #region 增删改操作 /// <summary> /// 新装受理,如果无数据插入,有数据则更新 /// </summary> /// <param name="gongChengBH">工程编号</param> /// <param name="minBanGCMXDTO">dto</param> /// <param name="logininfo">登陆信息</param> /// <param name="tran">事务</param> /// <returns>true or false</returns> public static bool XinZhuangSL(string gongChengBH, MinBanGCMXDTO minBanGCMXDTO, LoginInfo logininfo, OracleTransaction tran) { bool result = false; Entity.MB_XINZHUANGYW xinZhuang = new Entity.MB_XINZHUANGYW(); if (minBanGCMXDTO.ID > 0) { xinZhuang = _MB_XINZHUANGYWProcess.SelectMB_XINZHUANGYW(minBanGCMXDTO.ID,tran); } xinZhuang.S_GONGCHENGBH = gongChengBH; xinZhuang.N_BIAONENGL = minBanGCMXDTO.N_BIAONENGL; xinZhuang.I_CHAOBIAOFS = minBanGCMXDTO.I_CHAOBIAOFS; xinZhuang.S_BIAOWEI = minBanGCMXDTO.S_BIAOWEI; xinZhuang.I_LIANJIEFS = minBanGCMXDTO.I_LIANJIEFS; xinZhuang.S_RANQIBTXM = minBanGCMXDTO.S_RANQIBTXM; xinZhuang.I_CHUSHICM = minBanGCMXDTO.I_CHUSHICM; xinZhuang.I_FANGWULX = minBanGCMXDTO.I_FANGWULX; xinZhuang.S_GONGQIHTH = minBanGCMXDTO.S_GONGQIHTH; xinZhuang.S_PDABH = minBanGCMXDTO.S_PDABH; xinZhuang.S_ANJIANBH = minBanGCMXDTO.S_ANJIANBH; xinZhuang.S_CAOZUOR = logininfo.Account; xinZhuang.D_CAOZUOSJ = DateTime.Now; xinZhuang.I_JLZT = 0; xinZhuang.S_SHIJISYR = minBanGCMXDTO.S_SHIJISYR; result = _MB_XINZHUANGYWProcess.InsertOrUpdate(xinZhuang, tran); return result; } #endregion #region 查询操作 #endregion } }
工程信息业务聚合:
//********************************************************************************// //创建日期:<创建日期,2013-2-19> //创建作者:<王磊,wanglei@shanghai3h.com> //功能说明:工程信息 //********************************************************************************// using System; using CSMS2.Application.DTO.MinBanYW; using CSMS2.DataAccess.MinBanYW; using CSMS2.Entity; using CSMS2.Infrastructure.DataType; using Oracle.DataAccess.Client; namespace CSMS2.Mould.MinBanYW { /// <summary> /// 工程信息 /// </summary> public class GongChengXX { #region 变量 private static MB_GONGCHENGXXProcess _MB_GONGCHENGXXProcess = new MB_GONGCHENGXXProcess(); #endregion #region 增删改操作 /// <summary> /// 受理 根据MinBanGCZBDTO插入民办工程信息表,如果无数据插入,有数据则更新 /// </summary> /// <param name="minBanGCZBDTO">dto</param> /// <param name="logininfo">登陆信息</param> /// <param name="tran">事务</param> /// <returns>true or false</returns> public static bool InsertGongChengXX(MinBanGCZBDTO minBanGCZBDTO, LoginInfo logininfo, OracleTransaction tran) { bool result = false; MB_GONGCHENGXX gongChengXX = new MB_GONGCHENGXX(); if (minBanGCZBDTO.ID > 0) { gongChengXX = _MB_GONGCHENGXXProcess.SelectMB_GONGCHENGXX(minBanGCZBDTO.ID, tran); } gongChengXX.S_GONGCHENGBH = minBanGCZBDTO.S_GONGCHENGBH;// gongChengBH; gongChengXX.I_GONGCHENGLX = minBanGCZBDTO.I_GONGCHENGLX; gongChengXX.I_YEWULX = minBanGCZBDTO.I_YEWULX; gongChengXX.I_KID = minBanGCZBDTO.I_KID; gongChengXX.I_LIUCHENGID = minBanGCZBDTO.I_LIUCHENGID;//???? gongChengXX.S_CID = minBanGCZBDTO.S_CID; gongChengXX.S_ST = minBanGCZBDTO.S_ST; gongChengXX.S_HM = minBanGCZBDTO.S_HM; gongChengXX.S_DZ = minBanGCZBDTO.S_DZ; gongChengXX.I_QUYUBH = minBanGCZBDTO.I_QUYUBH; gongChengXX.I_ZHENGJIANLX = minBanGCZBDTO.I_ZHENGJIANLX; gongChengXX.S_ZHENGJIANHM = minBanGCZBDTO.S_ZHENGJIANHM; gongChengXX.S_YONGHUDZ = minBanGCZBDTO.S_YONGHUDZ; gongChengXX.I_DAOLUBH = minBanGCZBDTO.I_DAOLUBH; gongChengXX.S_YONGHUYB = minBanGCZBDTO.S_YONGHUYB; gongChengXX.S_LIANXISJ = minBanGCZBDTO.S_LIANXISJ; gongChengXX.S_LIANXIDH = minBanGCZBDTO.S_LIANXIDH; gongChengXX.S_ZHANGDANMC = minBanGCZBDTO.S_ZHANGDANMC; gongChengXX.S_ZHANGDANDZ = minBanGCZBDTO.S_ZHANGDANDZ; gongChengXX.S_ZHANGDANYB = minBanGCZBDTO.S_ZHANGDANYB; gongChengXX.I_QIYUAN = minBanGCZBDTO.I_QIYUAN; gongChengXX.N_BIAONENGL = minBanGCZBDTO.N_BIAONENGL; gongChengXX.I_CHAOBIAOFS = minBanGCZBDTO.I_CHAOBIAOFS; gongChengXX.S_SHOULIR = minBanGCZBDTO.S_SHOULIR; gongChengXX.S_SHOULIZD = minBanGCZBDTO.S_SHOULIZD; gongChengXX.I_SHOULIFS = minBanGCZBDTO.I_SHOULIFS; gongChengXX.D_SHOULISJ = minBanGCZBDTO.D_SHOULISJ; gongChengXX.S_GONGCHENGBZ = ""; gongChengXX.I_LIUCHENGZT = 0; gongChengXX.S_CAOZUOR = logininfo.Account; gongChengXX.D_CAOZUOSJ = DateTime.Now; gongChengXX.I_JLZT = 0; gongChengXX.I_CEGU = minBanGCZBDTO.I_CEGU; gongChengXX.I_YONGQIXZ = minBanGCZBDTO.I_YONGQIXZ; result = _MB_GONGCHENGXXProcess.InsertOrUpdate(gongChengXX, tran); return result; } /// <summary> /// 根据主键更新工程状态 /// </summary> /// <param name="id"></param> /// <param name="gongChengZT"></param> /// <param name="tran"></param> /// <returns></returns> public static bool UpdateGongChengZT(int id, int gongChengZT,OracleTransaction tran) { bool result = false; MB_GONGCHENGXX gongChengXX = _MB_GONGCHENGXXProcess.SelectMB_GONGCHENGXX(id, tran); gongChengXX.I_GONGCHENGZT = gongChengZT; result = _MB_GONGCHENGXXProcess.InsertOrUpdate(gongChengXX, tran); return result; } #endregion #region 查询方法 #endregion } }
民用业务引擎
/// <summary> /// 受理 /// </summary> /// <param name="errMess">错误信息</param> /// <param name="minBanGCZBDTO">主表</param> /// <param name="minBanGCMXDTO">明细表</param> /// <param name="logininfo">登陆信息</param> /// <returns>true or false</returns> public static bool MinBanYWSL(out string errMess, MinBanGCZBDTO minBanGCZBDTO, MinBanGCMXDTO minBanGCMXDTO, LoginInfo logininfo) { errMess = ""; Func<OracleTransaction, bool> func = tran => { //流程ID int liuChengID = 0; //流程类别 string liuChengLB = GetLiuChengLB(minBanGCZBDTO.I_GONGCHENGLX.Value, out liuChengID); minBanGCZBDTO.I_KID = WorkFlow.GetInstanceID(liuChengLB, tran); minBanGCZBDTO.I_LIUCHENGID = liuChengID; //插入工程信息 bool result = GongChengXX.InsertGongChengXX(minBanGCZBDTO, logininfo, tran); if (result) { switch (minBanGCZBDTO.I_YEWULX) { case MB_YEWULX.新装: result = XinZhuangYW.XinZhuangSL(minBanGCZBDTO.S_GONGCHENGBH, minBanGCMXDTO,logininfo, tran); break; case MB_YEWULX.拆除: result = LianXiD.ChaiChuSL(minBanGCZBDTO, minBanGCMXDTO, logininfo, tran); break; case MB_YEWULX.过户: result = GuoHuYW.GuoHuSL(minBanGCZBDTO, minBanGCMXDTO, logininfo, tran); break; default: break; } } //新增时需要启动流程 if (result && minBanGCZBDTO.ID <= 0) { //启动流程 int nextStep = 0; WorkFlow.Start(minBanGCZBDTO.I_KID.Value,logininfo.Account, liuChengLB, out nextStep, tran); //需要测估 if (minBanGCZBDTO.I_CEGU == 1) { result = WorkFlow.GoToNext(minBanGCZBDTO.I_KID.Value,2, logininfo.Account, tran); } //更改工程信息工程状态 if (result) { result = GongChengXX.UpdateGongChengZT(minBanGCZBDTO.ID, WorkFlow.GetNextStepInt(minBanGCZBDTO.I_KID.Value,tran), tran); } } return result; }; return Transaction.InvokeOracleTransaction(logininfo.Account, func, out errMess); }