如何在FastEndpoints中使用IRouteConstraint?迁移时复用现有实现类
在FastEndpoints中复用IRouteConstraint实现类(Hashids解析)
1. 注册约束类与映射别名
首先在Program.cs中完成两步配置:
- 将你的自定义约束类注册到服务容器:
builder.Services.AddSingleton<IRouteConstraint, HashIdRouteConstraint>(); - 为约束配置路由别名(方便在路由模板中引用):
builder.Services.Configure<RouteOptions>(opts => { opts.ConstraintMap.Add("hashid", typeof(HashIdRouteConstraint)); });
2. 在端点中使用约束
有两种方式可以在FastEndpoints中应用你的Hashid约束:
方式一:通过路由属性指定
直接在端点类的HttpGet/HttpPost等属性中使用别名:
public class GetUserEndpoint : EndpointWithoutRequest<UserResponse> { [HttpGet("/users/{userId:hashid}")] public override async Task HandleAsync(CancellationToken ct) { // userId参数已被约束解析为实际ID var userId = Route<int>("userId"); // 后续业务逻辑 } }
方式二:通过端点配置方法指定
如果偏好代码配置而非属性,可以在Configure方法中为路由参数绑定约束:
public class GetUserEndpoint : EndpointWithoutRequest<UserResponse> { public override void Configure() { Get("/users/{userId}"); RouteConstraint("userId", typeof(HashIdRouteConstraint)); } public override async Task HandleAsync(CancellationToken ct) { var userId = Route<int>("userId"); // 后续业务逻辑 } }
3. 注意事项
- 确保你的
HashIdRouteConstraint类的Match方法逻辑正确,能将Hashid字符串解析为目标类型(如int、long),并返回匹配结果。 - 如果约束类需要依赖其他服务(比如Hashids的加密密钥配置),需提前将这些依赖注册到容器,确保约束类构造函数能正确注入依赖。
内容的提问来源于stack exchange,提问作者Phat Huynh
相关产品推荐
相关产品推荐

