如果我在 ASP.NET 控制器中使用属性路由,这些路径模板是否被认为是硬编码的?例如,如果我添加[HttpGet("/employee")]
or [Route("/employee")]
,/employee
路径是硬编码值吗?
1 回答
正如其他人在评论中指出的那样,这些路线肯定是硬编码的——但这可能不是一个真正的问题。更好地了解是什么需求导致了这种担忧,因为解决方案最终将取决于此。同时,我可以根据常见的场景提供一些高层次的指导。
单层 Web 应用程序
如果您的控制器是作为 Web 应用程序的一部分分发的,并且您的路由总是在设计时定义(即,作为您的开发过程的一部分),那么您的路由路径是否被硬编码为一部分只是一种风格偏好您的控制器或硬编码为您的Startup
课程的一部分。这是大多数 Web 应用程序的典型场景。
可分发的类库
如果您将控制器作为类库(或 Razor 类库)的一部分分发,该类库(或 Razor 类库)旨在用于多个Web 应用程序,那么这是一个更大的考虑因素。在这种情况下,将路由硬编码为控制器的一部分会阻止类库的使用者修改路径。
如果您想确保始终使用相同的路由,同时消除基于每个应用程序配置它们的需要,这可能是有利的。但是,允许每个应用程序在其类中自定义这些路由可能更有意义,Startup
从而使消费者可以灵活地自定义库的端点所在的位置。如果是这种情况,在类库的控制器中硬编码这些值是不可取的。
扩展方法
如果后者是要求,通常包含一个扩展方法
IRouteBuilder
和/或IEndpointRouteBuilder
以便消费者可以轻松地为您的库配置路由,同时接受您希望它们覆盖的任何变量的参数,例如路径前缀。这提供了灵活性和易于配置之间的平衡。例如,这可能类似于以下内容:public static ControllerActionEndpointConventionBuilder MapEmployeeRoute( this IEndpointRouteBuilder routes, string pathPrefix = "Employee", string controller = "Employee", string action = "Index" ) => routes.MapControllerRoute( name: "Employee-" + pathPrefix?.Replace("/", "", System.StringComparison.OrdinalIgnoreCase), pattern: pathPrefix?.Trim('/') + "/{action}", defaults: new { controller, action, pathPrefix } );
可以与以下任何调用一起使用:
public static void Configure(IApplicationBuilder app, IWebHostEnvironment env) > { … app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapEmployeeRoute(); //Maps /Employee endpoints.MapEmployeeRoute("Administration/Staff"); //Maps /Administration/Staff/ endpoints.MapEmployeeRoute("/Administration/Staff/"); //Tolerate variations endpoints.MapEmployeeRoute("Staff", "MyEmployee"); //Reference derived controller endpoints.MapEmployeeRoute("Staff", "Employee", "Add"); //Default to the Add() action }); }
动态路由配置
注意:这是一个非常罕见的场景,所以我什至犹豫要不要提出来。也就是说,如果它与您的要求相关,我会将其包括在内以保持完整性。
另一种可能需要对路由进行硬编码的情况是,如果出于某种原因,您需要在运行时动态配置它们和/或使用来自外部数据源的配置值。
例如,如果您正在构建一个平台即服务 (PAAS),有时需要提供一个 Web 界面,用户可以在其中配置与特定服务关联的路由,然后动态注册这些路由,而不是将它们硬编码到平台本身。不过,这是一种更复杂的方法。