FastEndpoints能否将Group前缀配置在Version前缀之前?
问题
是否可配置FastEndpoints框架,使Group路由前缀置于Version路由前缀之前?若不支持,是否有相关改进计划?
目前我有Web和移动端两类端点,移动端端点配置Group<MobileGroup>(),Web端配置Group("web"),同时指定Version("1"),并在Program类中做了如下配置:
app.UseFastEndpoints(config => { config.Endpoints.RoutePrefix = "api"; config.Versioning.Prefix = "v"; config.Versioning.DefaultVersion = 1; config.Versioning.PrependToRoute = true; }
最终生成的路由中Version前缀在Group前缀之前,希望将Version前缀放在Group前缀之后。目前只能在每个端点的Configure()中手动指定RoutePrefixOverride("api/mobile")来规避问题,端点配置代码如下:
public override void Configure() { Get("test"); Version(1); AllowAnonymous(); //RoutePrefixOverride("api/mobile"); //I'd like to do without it. Group<MobileGroup>(); //will be placed after the version prefix !!! } public sealed class MobileGroup : Group { public MobileGroup() { Configure("mobile", _ => {}); } }
回答
目前FastEndpoints框架不支持直接配置让Group前缀置于Version前缀之前,框架默认的路由生成逻辑是先拼接版本前缀,再拼接组前缀。
关于改进计划:截至当前版本,官方尚未将此需求列入公开的roadmap中。若需要推动该功能落地,可通过框架的代码仓库提交Feature Request,详细说明业务场景和需求。
现有无需每个端点手动写RoutePrefixOverride的替代方案:
方案一:在组配置中统一指定包含版本的前缀,同时关闭全局版本前缀自动拼接
- 修改Program中的版本配置,关闭自动前置版本前缀:
app.UseFastEndpoints(config => { config.Endpoints.RoutePrefix = "api"; config.Versioning.Prefix = "v"; config.Versioning.DefaultVersion = 1; config.Versioning.PrependToRoute = false; } - 在Group类中直接配置带版本的前缀:
这样生成的路由就是public sealed class MobileGroup : Group { public MobileGroup() { Configure("mobile/v1", _ => {}); } }api/mobile/v1/test,符合需求。
- 修改Program中的版本配置,关闭自动前置版本前缀:
方案二:自定义路由格式化逻辑
通过实现IRouteFormatter接口,重写路由拼接顺序,让组前缀先于版本前缀拼接。示例代码大致如下:public class CustomRouteFormatter : IRouteFormatter { public string Format(EndpointDefinition ep) { var parts = new List<string>(); // 添加全局路由前缀 if (!string.IsNullOrEmpty(ep.RoutePrefix)) parts.Add(ep.RoutePrefix); // 添加组前缀 if (!string.IsNullOrEmpty(ep.GroupPrefix)) parts.Add(ep.GroupPrefix); // 添加版本前缀(如果启用) if (ep.Version != null && ep.Version.PrependToRoute) parts.Add($"{ep.Version.Prefix}{ep.Version.Number}"); // 添加端点路由 parts.Add(ep.Route); return string.Join("/", parts); } }然后在Program中注册自定义格式化器:
app.UseFastEndpoints(config => { // 其他配置保持不变 config.Endpoints.RouteFormatter = new CustomRouteFormatter(); });注意:自定义路由格式化器需要适配框架的版本逻辑,确保版本号能正确读取和处理。
内容的提问来源于stack exchange,提问作者Нуркен Зулпыхаров
相关产品推荐
相关产品推荐

