说 REPR 之前,得先澄清一件事——它并不是什么框架内置的抽象接口,更不是 C# 语言自带的特性。这是 FastEndpoints 社区对端点组织逻辑的一种模式归纳:Request → Endpoint → Response。它不强制你非得把代码拆成三个文件,但一旦你按照这个结构来组织,路由、验证、序列化、日志、测试这些事,自然就解耦了。别被名字吓到,直接上手用起来就好。

Endpoint 是 REPR 的落地载体

这是最贴近 REPR 设计意图的基类。它显式声明了输入和输出的契约,编译期就能约束好类型流,比 EndpointWithoutRequest 或者裸的 Endpoint 更适合那些 API 契约明确的场景。

经常有人踩的坑是:SendAsync(new { ... }) 直接返回匿名对象。后果就是,Swagger 文档里看不到响应结构,前端生成的 TypeScript 客户端也缺字段,单元测试更是无从下手 mock。

正确的做法是:

Configure() 里写错动词或路径,端点会直接“消失”

FastEndpoints 不像传统控制器那样靠扫描来注册路由。它是通过 Configure 方法里的 GetPostPatch 这些调用来注册端点的。只要漏写、拼错、或者多写了一个斜杠,这个 API 就 404 了,而且连个提示都不会有。

几个典型的翻车现场:

一个实用的建议:在 Configure 方法的结尾,显式地加上 AllowAnonymous()RequireAuthorization() 来声明权限,避免因为中间件执行顺序的问题,导致认证拦截被莫名其妙地跳过。

PreProcessor / PostProcessor 不是装饰器,是独立的生命周期阶段

IPreProcessorIPostProcessor 的执行时机是固定的:Pre 在模型绑定之后、HandleAsync 之前执行;Post 在 SendAsync 被调用之后、响应被写出之前执行。它们不能修改 HandleAsync 的返回值,也不能中途终止流程(除非你抛异常)。

这里有几个容易中招的地方:

DTO 验证失败时,别手动 throw ValidationException

FastEndpoints 默认就集成了 FluentValidation。只要你的 TRequest 类有对应的 IValidator 实现,验证失败后,框架会自动返回 400 状态码,并附带格式化的错误详情(一个 ValidationFailure 数组)。你要是手动去 throw 一个异常,反而会让全局异常中间件接管,把标准错误结构给搞丢了。

几个关键点值得留意:

真正麻烦的地方在于:当 DTO 里包含嵌套对象或者集合时,FluentValidation 产生的错误路径(PropertyName)默认是 Address.Street 这种格式。但前端的表单通常按 address.street 来绑定。这就需要在验证器里显式调用 OverridePropertyName,或者统一转换成小驼峰格式,否则错误信息定位会不准,给前端调试带来麻烦。

本文转载于:https://www.php.cn/faq/2333701.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。