控制器接口
MVC Controller仍然是我们推荐的结构,它通用,灵活,稳定,但目前不支持AOT。
控制器的作用
以下是控制器应该做的事情:
- 路由匹配:定义路由规则,匹配请求路径。
- 验证请求:验证请求参数是否合法,是否符合预期。
- 权限处理:检查用户是否有权限访问相关的数据。
- 响应返回:验证不通过时,返回适当的响应码和错误信息。
- 调用服务:调用
Manager,来处理业务逻辑。 - 处理返回结果:将服务返回的结果,转换为适当的响应格式。
- 接口异常处理:捕获异常,返回适当的错误响应。
- 多语言支持:根据请求头中的语言偏好,返回相应语言的内容。
以下是不应该出现在控制器中内容:
- 直接使用
DbContext访问数据库。 - 直接实现业务逻辑。
- 直接实现算法或数据处理。
一句话概念,除了应该做的事情,其他的都不建议直接在控制器中实现。因为在复杂场景下,控制器本身就需要处理很多事情。
Note
控制器接口,尽可能只表达与接口约定相关的内容,业务实现应该通过调用Manager去实现,这样能够保持代码的整洁和可维护性。
这不是强制要求,但建议遵循这个原则。
通用推荐做法
- ✅使用HTTP谓词(GET, POST, PUT, DELETE等)来明确路由的定义。
- ✅直接使用模型类或
ActionResult<T>作为接口返回内容,不要自定义包装类。 - ✅在控制器中使用
Problem()方法来返回错误响应。 - ✅在Manager中
BusinessException异常来抛出错误信息。
Problem和BusinessException都支持自定义错误码。
常见"错误"方法
- ❌自定义包装返回类型,比如
ApiResponse<T> - ❌接口全部返回200。
Note
直接使用标准的HTTP状态码,能够最大限度兼容各种客户端,避免不必要的麻烦,它与自定义业务状态码并不冲突,业务状态码可以通过Problem和BusinessException来实现,它们最终返回ErrorResult结构内容。