C#项目中存储共享API路由的最优实现方案是什么?
共享API路由实现方案优化建议
你当前的实现已经具备编译期校验、无运行时开销、结构清晰的优势,完全可以满足绝大多数中小型项目的需求。如果需要适配更复杂的场景,可以参考以下优化方向:
1. 补充路径参数支持
现有实现仅覆盖了无参数的固定路由,遇到带路径参数的端点(如/api/v1/users/{userId})时,可以同时保留常量模板和动态拼接能力:
public static class Users { private const string Controller = $"{Base}{nameof(Users)}{Slash}"; public const string List = $"{Controller}{nameof(List)}"; public const string Register = $"{Controller}{nameof(Register)}"; // 常量模板可直接用于控制器属性路由、Swagger生成 public const string GetByIdTemplate = $"{Controller}{{UserId}}"; // 动态拼接方法供客户端调用时使用 public static string GetById(Guid userId) => $"{Controller}{userId}"; }
2. 支持多API版本适配
如果你的API需要多版本共存,可以将版本号从硬编码常量调整为可配置参数,同时保留路由结构的复用性:
public static class RouteProvider { private const string Slash = "/"; private const string Prefix = $"api{Slash}"; public static string GetBaseRoute(string version = "v1") => $"{Prefix}{version}{Slash}"; public static class Users { public static string GetControllerBase(string version = "v1") => $"{GetBaseRoute(version)}{nameof(Users)}{Slash}"; public static string GetListRoute(string version = "v1") => $"{GetControllerBase(version)}{nameof(List)}"; public static string GetRegisterRoute(string version = "v1") => $"{GetControllerBase(version)}{nameof(Register)}"; } }
3. 与ASP.NET Core端点映射联动
针对ASP.NET Core项目,可以编写扩展方法直接绑定路由与端点实现,避免在控制器上重复声明路由属性,减少冗余代码:
public static class UserEndpointRouteExtensions { public static IEndpointRouteBuilder MapUserApiEndpoints(this IEndpointRouteBuilder app) { var userRouteGroup = app.MapGroup(Routes.Users.Controller); // 绑定用户列表端点 userRouteGroup.MapGet(Routes.Users.List, async (IUserService userService) => Results.Ok(await userService.GetUserListAsync())); // 绑定用户注册端点 userRouteGroup.MapPost(Routes.Users.Register, async (RegisterUserRequest request, IUserService userService) => { var result = await userService.RegisterAsync(request); return result.IsSuccess ? Results.Ok(result.Data) : Results.BadRequest(result.ErrorMsg); }); return app; } }
使用时仅需在Program.cs中调用app.MapUserApiEndpoints()即可完成所有用户相关端点的注册。
额外说明
- 项目规模较小的情况下不需要过度设计,你当前的实现已经是最优解
- 常量路由的实现方式完全兼容Swagger/OpenAPI生成,无需额外适配
- 如果需要和前端.NET项目(如Blazor WASM)共享路由,可将该类库编译为.NET Standard版本直接引用
内容的提问来源于stack exchange,提问作者Arthur Edgarov
相关产品推荐
相关产品推荐

