查詢參數(shù)優(yōu)化,盡量使用對象。 InvokingLogController.cs 47
將公共方法提取到父類中,避免出現(xiàn)控制器之間的互相調(diào)用。 FunctionNodeController.cs 522
控制器中不能出現(xiàn)寫死的中或者英文磕诊。 StartInstanceController.cs 50
顯示聲明方法的作用域。非前端調(diào)用的(public)方法增加[NoAction]特性。(public ,private ) InstacneSheetsController.cs 246
在控制器內(nèi)霎终,禁止聲明其他類或者枚舉滞磺,統(tǒng)一在ViewModel/中聲明。
將控制器按照模塊合并莱褒,將控制器的粒度縮谢骼А(隱患:舊版本無法直接更新Controller.dll)。新增父類控制器保礼,公共方法寫在父類控制器中沛励。
精簡控制器向前端返回的內(nèi)容,非必要內(nèi)容不用返回炮障。
將業(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ù)存在重復(fù)〔骢耍可以將類似的控制器合并成一個松忍,提取公共方法到(Services)業(yè)務(wù)層。
這里提供兩種思路:
- 建立一個父類控制器筷厘,提取公共方法以及參數(shù)到父類控制器和業(yè)務(wù)類中鸣峭。
- 將幾個相關(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ù)層代碼
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);
});
}
}