Шаблоны пути, определенные с использованием маршрутизации атрибутов, считаются жестко закодированными? - PullRequest
5 голосов
/ 06 февраля 2020

Если я использую Маршрутизацию атрибутов в ASP. NET контроллере, считаются ли эти шаблоны путей жестко закодированными? Например, если я добавлю [HttpGet("/employee")] или [Route("/employee")], является ли путь /employee жестко заданным значением?

1 Ответ

1 голос
/ 08 марта 2020

Как отмечают другие в комментариях, эти маршруты определенно жестко запрограммированы, но это может не представлять реальной проблемы. Было бы полезно лучше понять, какие требования являются причиной этой проблемы, поскольку решение в конечном итоге будет зависеть от этого. В то же время я могу предоставить некоторые рекомендации на высоком уровне, основанные на распространенном сценарии ios.

Одноуровневое веб-приложение

Если ваши контроллеры распространяются как часть вашего веб-приложения, и ваши маршруты всегда определены во время разработки (т. е. как часть вашего процесса разработки), тогда это просто предпочтение стилиста c относительно того, являются ли пути маршрутов жестко закодированными как часть ваших контроллеров или жесткими кодируется как часть вашего Startup класса. Это типичный сценарий для большинства веб-приложений .

Распространяемая библиотека классов

Если вы распространяете ваши контроллеры как часть библиотеки классов (или Razor Class Library), которая предназначена для использования в нескольких веб-приложениях, тогда это более важный вопрос. В этом сценарии жесткое кодирование маршрутов как части вашего контроллера не позволяет потребителям вашей библиотеки классов изменять пути.

Этот может быть полезным, если вы хотите, чтобы всегда использовались одни и те же маршруты, одновременно устраняя необходимость их настройки для каждого приложения. Но может быть вместо имеет смысл разрешить каждому приложению настраивать эти маршруты в своем классе 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
  });
}

Dynami c Конфигурация маршрута

Примечание: Это довольно необычный сценарий, и поэтому я не решаюсь даже упомянуть его. Тем не менее, я включил его для полноты в случае, если это относится к вашим требованиям.

Еще один сценарий, когда жесткое кодирование маршрутов может быть проблемой, если по какой-то причине они вам нужны динамически настраиваться во время выполнения и / или использовать значения конфигурации из внешнего источника данных.

Например, если вы строите платформу как службу (PAAS), иногда желательно предоставить веб-интерфейс, где пользователи могут настраивать маршруты, связанные с конкретными службами, а затем динамически регистрировать их вместо жестко закодировать их в самой платформе. Это гораздо более сложный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...