惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
C
Check Point Blog
博客园_首页
B
Blog
D
Docker
U
Unit 42
量子位
I
InfoQ
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
GbyAI
GbyAI
L
LangChain Blog
云风的 BLOG
云风的 BLOG
博客园 - Franky
美团技术团队
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
Vercel News
Vercel News
Recent Announcements
Recent Announcements
雷峰网
雷峰网
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Google DeepMind News
Google DeepMind News

博客园 - zyi

Windows FTP安装 组合模式 Oracle优化 Oracle的汉字转拼音首字母的函数 创建job 建索引 加解密 代码规范工具 耦合内聚封装 Dev进度条 SQL_SERVER 导oracle(转) SQL_SERVER 连接oracle(转) win7电脑上wifi Oracle对象统计信息 关于odp.net的FetchSize属性 技巧类 linq in 语法 温习设计模式 静态与非静态(转改)
关于引擎的设计
zyi · 2013-02-19 · via 博客园 - zyi

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

首先对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);
        }