在開始之前你需要知道:
1、通過拋異常--全局捕獲異常的方式返回業務錯誤信息性能是非常差的(不知道為什么的可以百度一下)
2、如何將錯誤信息綁定到mvc模型驗證中
自定義返回內容

//返回內容接口 public interface IBusinessCodeStatus { // 業務狀態碼 public BusinessCode Code { get; set; } // 信息 public string Message { get; set; } // 錯誤級別 public ErrorLevel Level { get; set; } // 錯誤類型 public ErrorCategory Category { get; set; } } //業務代碼 public enum BusinessCode { Success = 200, Error = 400 } // 錯誤級別 public enum ErrorLevel { // 系統級 System, // 業務級 Business } // 錯誤類型 public enum ErrorCategory { // 空對象 EmptyObject, // 通用 Currency }
在這里我用結構體去包裝返回的業務狀態
為什么要用結構體?
因為結構體保存在棧中,在方法執行完后就會自動釋放
如果是對象則會放在托管堆上,最后由GC去釋放

public struct BusinessCodeStatus : IBusinessCodeStatus { public BusinessCode Code { get; set; } public string Message { get; set; } public ErrorLevel Level { get; set; } public ErrorCategory Category { get; set; } public static readonly BusinessCodeStatus Success = new BusinessCodeStatus();//返回成功信息 }
定義Dto的模型基類

// 模型基類 public class BaseResult { // 業務狀態 public BusinessCodeStatus ZCodeStatus { get; set; } = BusinessCodeStatus.Success; public void BadResult(string message, ErrorCategory category, ErrorLevel level = ErrorLevel.Business, BusinessCode code = BusinessCode.Error) { ZCodeStatus = new BusinessCodeStatus { Category = category, Message = message, Code = code, Level = level }; } public void BadResult(string message) { ZCodeStatus = new BusinessCodeStatus { Message = message, }; } public static readonly BaseResult Success = new BaseResult(); }
下面開始舉一個栗子
模型
public class DtoUser : BaseResult { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Sex { get; set; } }
業務層
public class UserBll { public DtoUser GetUser_Error() { var user = new DtoUser(); user.BadResult("業務出錯了!!!!"); //這個地方處理不太優雅
//當時想模仿IActionResult做成接口,但是這樣子就會高度定制化
//就會導致影響編碼習慣
//所以在這里我就舍棄了優雅 ^_^
return user; } //成功返回結果 public DtoUser GetUser_Success() { //一系列的業務處理之后得到結果 return new DtoUser { Id = 1, Age = 18, Name = "張三", Sex = "男" }; ; } }
控制器層
[Route("values")] [ApiController] public class ValuesController : ControllerBase { private readonly UserBll _userBll; public ValuesController() { _userBll = new UserBll(); } [HttpGet("success")] public string GetResult_Success() { var model = _userBll.GetUser_Success(); return "成功"; } [HttpGet] public string GetResult_Error() { var model = _userBll.GetUser_Error(); if (model.ZCodeStatus.Code == BusinessCode.Error) return model.ZCodeStatus.Message; return "成功"; } }
這樣子就可以將業務層的錯誤信息拋至接口層
然后定制化400給前端顯示(這里可以綁定模型驗證)