关于引擎的设计

看了下大家引擎的代码,总感觉比较臃肿。现在做了如下修改,希望对大家设计引擎有帮助。

首先对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);
        }
原文地址:https://www.cnblogs.com/zyizyizyi/p/2917143.html