Blogs
📆 2025-12-19 00:45

控制器接口

MVC Controller仍然是我们推荐的结构,它通用,灵活,稳定,但目前不支持AOT。

控制器的作用

以下是控制器应该做的事情:

  • 路由匹配:定义路由规则,匹配请求路径。
  • 验证请求:验证请求参数是否合法,是否符合预期。
  • 权限处理:检查用户是否有权限访问相关的数据。
  • 响应返回:验证不通过时,返回适当的响应码和错误信息。
  • 调用服务:调用Manager,来处理业务逻辑。
  • 处理返回结果:将服务返回的结果,转换为适当的响应格式。
  • 接口异常处理:捕获异常,返回适当的错误响应。
  • 多语言支持:根据请求头中的语言偏好,返回相应语言的内容。

以下是不应该出现在控制器中内容:

  • 直接使用DbContext访问数据库。
  • 直接实现业务逻辑。
  • 直接实现算法或数据处理。

一句话概念,除了应该做的事情,其他的都不建议直接在控制器中实现。因为在复杂场景下,控制器本身就需要处理很多事情。

Note

控制器接口,尽可能只表达与接口约定相关的内容,业务实现应该通过调用Manager去实现,这样能够保持代码的整洁和可维护性。

这不是强制要求,但建议遵循这个原则。

通用推荐做法

  • ✅使用HTTP谓词(GET, POST, PUT, DELETE等)来明确路由的定义。
  • ✅直接使用模型类或ActionResult<T>作为接口返回内容,不要自定义包装类。
  • ✅在控制器中使用Problem()方法来返回错误响应。
  • ✅在Manager中BusinessException异常来抛出错误信息。

ProblemBusinessException都支持自定义错误码。

常见"错误"方法

  • ❌自定义包装返回类型,比如ApiResponse<T>
  • ❌接口全部返回200。

Note

直接使用标准的HTTP状态码,能够最大限度兼容各种客户端,避免不必要的麻烦,它与自定义业务状态码并不冲突,业务状态码可以通过ProblemBusinessException来实现,它们最终返回ErrorResult结构内容。