H3BPM Controllers 優(yōu)化方案

  1. 查詢參數(shù)優(yōu)化,盡量使用對象。 InvokingLogController.cs 47

  2. 將公共方法提取到父類中,避免出現(xiàn)控制器之間的互相調(diào)用。 FunctionNodeController.cs 522

  3. 控制器中不能出現(xiàn)寫死的中或者英文磕诊。 StartInstanceController.cs 50

  4. 顯示聲明方法的作用域。非前端調(diào)用的(public)方法增加[NoAction]特性。(public ,private ) InstacneSheetsController.cs 246

  5. 在控制器內(nèi)霎终,禁止聲明其他類或者枚舉滞磺,統(tǒng)一在ViewModel/中聲明。

  6. 將控制器按照模塊合并莱褒,將控制器的粒度縮谢骼А(隱患:舊版本無法直接更新Controller.dll)。新增父類控制器保礼,公共方法寫在父類控制器中沛励。

  7. 精簡控制器向前端返回的內(nèi)容,非必要內(nèi)容不用返回炮障。

  8. 將業(yè)務(wù)代碼從控制器中抽離目派,控制器之負(fù)責(zé)簡單邏輯。建立業(yè)務(wù)層代碼胁赢。

控制器中的查詢參數(shù)優(yōu)化企蹭,盡可能使用對象

        //參數(shù)過多
        public JsonResult GetInvokingLogList(PagerInfo pagerInfo, string startTime, string endTime, string serverCode){}

        //封裝參數(shù)
        public JsonResult GetInvokingLogList(InvokingLogParam InvokingLogParam){}

將過長的查詢參數(shù)提取成為一個對象。
命名:ControllerName+Param

將公共方法提取到父類中智末,避免出現(xiàn)控制器之間的互相調(diào)用谅摄。

        //錯誤示例
        private List<PortalTreeNode> InitReportCodeAndReportingN()
        {
            //通過構(gòu)造一個SysDeploymentController對象來調(diào)用方法
            var result = new SysDeployment.SysDeploymentController().GetReportTreeNodes(this);
            return result;
        }

        //正確示例
        private List<PortalTreeNode> InitReportCodeAndReportingN()
        {
            //將GetReportTreeNodes()方法提取到公共父類中
            var result = base.GetReportTreeNodes();
            return result;
        }

控制器內(nèi)禁止出現(xiàn)控制器的相互調(diào)用。

控制器中不能出現(xiàn)寫死的中或者英文

           //錯誤示例
          if (!SSOopenSheet(LoginName, MobileToken))
          {
              //中文字符禁止出現(xiàn)
              result = new ActionResult(false, "登錄超時系馆!", null, ExceptionCode.NoAuthorize);
              return Json(result, JsonRequestBehavior.AllowGet);
          }

          //正確示例
          if (!SSOopenSheet(LoginName, MobileToken))
          {
              //中文字符禁止出現(xiàn)
              result = new ActionResult(false, "msgGlobalString.LoginTimeOut", null, ExceptionCode.NoAuthorize);
              return Json(result, JsonRequestBehavior.AllowGet);
          }

務(wù)必遵循代碼規(guī)范送漠,按照代碼規(guī)范去實現(xiàn)代碼,代碼的可讀性由蘑、兼容性等闽寡。

顯示聲明方法的作用域。非前端調(diào)用的(public)方法增加[NoAction]特性

//錯誤示例
string GetSheetCodeByActivity(WorkflowTemplate.Activity Activity)

//正確示例
private string GetSheetCodeByActivity(WorkflowTemplate.Activity Activity)

被聲明為 public 的方法尼酿,不于前端做數(shù)據(jù)交互的方法需要增加[NoAction]特性爷狈。理論上,在Controllers中的方法都應(yīng)用于前端數(shù)據(jù)交互使用裳擎,Controllers中就不應(yīng)該出現(xiàn)這種方法涎永,這樣的方法應(yīng)當(dāng)提取到父類中,或者將這些和數(shù)據(jù)交互無關(guān)的鹿响、業(yè)務(wù)相關(guān)的方法提取到業(yè)務(wù)層中(Services)羡微。Controllers依賴于Services,由Services去處理業(yè)務(wù)邏輯惶我。

在控制器內(nèi)拷淘,禁止聲明其他類或者枚舉,統(tǒng)一在ViewModel/中聲明指孤。

一個文件中,只允許聲明一個類。

將控制器按照模塊合并恃轩,將控制器的粒度縮小

數(shù)據(jù)模型模塊

這幾個控制器其實都是數(shù)據(jù)模型模塊结洼,里面方法和參數(shù)存在重復(fù)〔骢耍可以將類似的控制器合并成一個松忍,提取公共方法到(Services)業(yè)務(wù)層。
這里提供兩種思路:

  1. 建立一個父類控制器筷厘,提取公共方法以及參數(shù)到父類控制器和業(yè)務(wù)類中鸣峭。
  2. 將幾個相關(guān)模塊控制器合并成一個。

這里建議第一種方案酥艳,但具體模塊還得結(jié)合實際情況來分析摊溶。

精簡控制器向前端返回的內(nèi)容,非必要內(nèi)容不返回充石。

給前端返回必要內(nèi)容即可莫换,不返回冗余的數(shù)據(jù)。并且盡量使用ActionResult 包裝返回內(nèi)容骤铃。

        /// <summary>
        /// 刪除組織權(quán)限
        /// </summary>
        /// <param name="ids">組織權(quán)限ID</param>
        /// <param name="schemaCode">數(shù)據(jù)模型編碼</param>
        /// <returns>刪除結(jié)果</returns>
        [HttpPost]
        public JsonResult DeleteBizObjectAcl(string ids, string schemaCode)
        {
            return ExecuteFunctionRun(() =>
            {
                ActionResult result = new ActionResult();
                if (!this.ParseParam(schemaCode))
                {
                    result.Success = false;
                    result.Message = "EditBizObjectSchema.Msg0";
                    return Json(result, JsonRequestBehavior.AllowGet);
                }
                string ObjectIds = ids;
                string[] AclIds = ObjectIds.Split(',');
                if (AclIds == null || AclIds.Length == 0)
                {
                    result.Success = false;
                    result.Message = "msgGlobalString.SelectItem";
                }
                else
                {
                    this.Engine.BizObjectManager.RemoveBizObjectAcls(schemaCode, "", AclIds);
                    result.Success = true;
                    result.Message = "msgGlobalString.DeleteSucced";
                }
                return Json(result, JsonRequestBehavior.AllowGet);
            });
        }

返回結(jié)果使用 ActionResult 類包裝拉岁,并且不要返回多余的數(shù)據(jù)。

將業(yè)務(wù)代碼從控制器中抽離惰爬,控制器之負(fù)責(zé)簡單邏輯喊暖。建立業(yè)務(wù)層代碼

業(yè)務(wù)示例

this.ParseParam(schemaCode);
this.Engine.BizObjectManager.RemoveBizObjectAcls(schemaCode, "", AclIds);

都提取至業(yè)務(wù)類中,Controller層只應(yīng)該依賴于Service層撕瞧,不應(yīng)該直接產(chǎn)生和Engine的依賴陵叽。(可以分別對Service和Controller做單元測試)。

更改后的代碼:

    /// <summary>
    /// 數(shù)據(jù)模型權(quán)限控制器
    /// </summary>
    [Authorize]
    public class BizObjectAclController : ControllerBase
    {

       private BizObjectAclService _bizObjectAclService = null;
        /// <summary>
        /// 數(shù)據(jù)模型業(yè)務(wù)類
        /// </summary>
        public BizObjectAclService BizObjectAclService
        {
            get
            {
                if (null == _bizObjectAclService)
                {
                    _bizObjectAclService = new BizObjectAclService();
                }
                return _bizObjectAclService;
            }
        }
        /// <summary>
        /// 刪除組織權(quán)限
        /// </summary>
        /// <param name="ids">組織權(quán)限ID</param>
        /// <param name="schemaCode">數(shù)據(jù)模型編碼</param>
        /// <returns>刪除結(jié)果</returns>
        [HttpPost]
        public JsonResult DeleteBizObjectAcl(string ids, string schemaCode)
        {
            return ExecuteFunctionRun(() =>
            {
                ActionResult result = new ActionResult();
                ///實現(xiàn)代碼精簡
                if (!BizObjectAclService.ParseParam(schemaCode))
                {
                    result.Success = false;
                    result.Message = "EditBizObjectSchema.Msg0";
                    return Json(result, JsonRequestBehavior.AllowGet);
                }
                string ObjectIds = ids;
                string[] AclIds = ObjectIds.Split(',');
                if (AclIds == null || AclIds.Length == 0)
                {
                    result.Success = false;
                    result.Message = "msgGlobalString.SelectItem";
                }
                else
                {
                    //實現(xiàn)代碼解耦风范,Controller不再直接依賴于Engine咨跌,而依賴于Service
                    BizObjectAclService.RemoveBizObjectAcls(schemaCode, "", AclIds);
                    result.Success = true;
                    result.Message = "msgGlobalString.DeleteSucced";
                }
                return Json(result, JsonRequestBehavior.AllowGet);
            });
        }
    }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市硼婿,隨后出現(xiàn)的幾起案子锌半,更是在濱河造成了極大的恐慌,老刑警劉巖寇漫,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刊殉,死亡現(xiàn)場離奇詭異,居然都是意外死亡州胳,警方通過查閱死者的電腦和手機记焊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栓撞,“玉大人遍膜,你說我怎么就攤上這事碗硬。” “怎么了瓢颅?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵恩尾,是天一觀的道長。 經(jīng)常有香客問我挽懦,道長翰意,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任信柿,我火速辦了婚禮冀偶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘渔嚷。我一直安慰自己进鸠,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布圃伶。 她就那樣靜靜地躺著堤如,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窒朋。 梳的紋絲不亂的頭發(fā)上搀罢,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音侥猩,去河邊找鬼榔至。 笑死,一個胖子當(dāng)著我的面吹牛欺劳,可吹牛的內(nèi)容都是我干的唧取。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼划提,長吁一口氣:“原來是場噩夢啊……” “哼枫弟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鹏往,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淡诗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后伊履,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體韩容,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年唐瀑,在試婚紗的時候發(fā)現(xiàn)自己被綠了群凶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡哄辣,死狀恐怖请梢,靈堂內(nèi)的尸體忽然破棺而出赠尾,到底是詐尸還是另有隱情,我是刑警寧澤毅弧,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布萍虽,位于F島的核電站,受9級特大地震影響形真,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜超全,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一咆霜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧嘶朱,春花似錦蛾坯、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至财异,卻和暖如春倘零,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背戳寸。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工呈驶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人疫鹊。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓袖瞻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拆吆。 傳聞我的和親對象是個殘疾皇子聋迎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容