在开始之前你需要知道:
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给前端显示(这里可以绑定模型验证)