在开始之前你需要知道:
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 = ,
Error =
} // 错误级别
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 = ,
Age = ,
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给前端显示(这里可以绑定模型验证)