ASP.NET Core API 如何添加自定义路由令牌解析器支持[namespace]路由
解决方案
完全可以通过ASP.NET Core原生的IApplicationModelConvention接口实现自定义路由令牌解析,不需要硬编码路由也不需要额外引入源代码生成器,完全兼容你使用的ApiEndpoints库的单控制器单Action设计,具体实现步骤如下:
1. 实现自定义路由公约类
该类用于扫描所有控制器的路由模板,自动替换[namespace]令牌为你指定的命名空间对应值:
using Microsoft.AspNetCore.Mvc.ApplicationModels; using System.Linq; public class NamespaceRouteTokenConvention : IApplicationModelConvention { public void Apply(ApplicationModel application) { foreach (var controller in application.Controllers) { // 筛选带路由特性的控制器 var routeSelectors = controller.Selectors.Where(s => s.AttributeRouteModel != null); foreach (var selector in routeSelectors) { var routeTemplate = selector.AttributeRouteModel.Template; if (!routeTemplate.Contains("[namespace]")) continue; // 可按需调整命名空间的截取规则,示例取命名空间最后一段作为路由值 var namespaceSegments = controller.ControllerType.Namespace.Split('.'); // 如需取多层命名空间作为路由前缀(比如Api/V1/Orders),可自行调整截取的索引范围后用/拼接 var namespaceRouteValue = namespaceSegments.Last().ToLower(); // 替换自定义令牌 selector.AttributeRouteModel.Template = routeTemplate.Replace("[namespace]", namespaceRouteValue); } } } }
2. 在Startup中注册公约
修改Startup.cs的ConfigureServices方法,将上述自定义公约注册到MVC配置中:
public void ConfigureServices(IServiceCollection services) { services.AddControllers(options => { // 注册自定义路由令牌解析公约 options.Conventions.Add(new NamespaceRouteTokenConvention()); }); }
3. 直接使用[namespace]路由标记
你可以直接在控制器上使用[Route("[namespace]/[action]")]这类路由规则,比如你目录中Orders文件夹下的Create控制器,命名空间如果是YourProject.Controllers.Orders,最终生成的路由就是orders/create,完全适配ApiEndpoints的设计规范。
内容的提问来源于stack exchange,提问作者maxc137
相关产品推荐
相关产品推荐

