Если вы хотите использовать более гибкий подход, вы можете рассмотреть возможность использования пользовательского соглашения о контроллере, которое может быть реализовано с использованием интерфейса IControllerModelConvention .Используя это, вы можете передать объект конфигурации в пользовательское соглашение и применить маршруты, используя это.Есть несколько способов решения этой проблемы, но вот пример реализации:
public class RoutingControllerModelConvention : IControllerModelConvention
{
private readonly IConfiguration _configuration;
public RoutingControllerModelConvention(IConfiguration configuration)
{
_configuration = configuration;
}
public void Apply(ControllerModel controllerModel)
{
const string RouteTemplate = "/api/projects/<id>/[action]";
var routeId = _configuration["RouteIds:" + controllerModel.ControllerName];
var firstSelector = controllerModel.Selectors[0];
if (firstSelector.AttributeRouteModel == null)
firstSelector.AttributeRouteModel = new AttributeRouteModel();
firstSelector.AttributeRouteModel.Template = RouteTemplate.Replace("<id>", routeId);
}
}
В этом примере я беру экземпляр IConfiguration
в конструктор, который заполняется из следующего appsettings.json
:
{
"RouteIDs": {
"Test1": 123,
"Test2": 234
}
}
Я понимаю, что вы вполне можете использовать что-то другое для вашей конфигурации, но использование этого подхода в этом примере должно помочь объяснить вещи проще.
В методе RoutingControllerModelConvention.Apply
, который вызывается для каждого контроллера в вашем проекте, мы ищем соответствующее значение из нашего экземпляра IConfiguration
, где мы используем controllerModel.ControllerName
, чтобы получить, например, Test1
.В этом примере это дает нам значение 123
.Затем мы берем первый селектор (всегда есть хотя бы один) и, в конечном счете, устанавливаем шаблон его маршрута равным /api/projects/123/[action]
.
. При таком подходе вам не нужно применять атрибут [Route]
к самому контроллеру, и вам не нужно использовать MapRoute
в Startup
.Все, что вам нужно сделать при добавлении новых контроллеров, это создать контроллер и добавить запись (в этом примере) appsettings.json
, соответственно.
Чтобы использовать это пользовательское соглашение, вам необходимонастройте его в Startup.ConfigureServices
:
services.AddMvc(options =>
{
options.Conventions.Add(new RoutingControllerModelConvention(Configuration));
});
Для получения дополнительной информации модель приложения и соглашения задокументированы здесь: Работа с моделью приложения в ASP.NET Core .
Я ценю, что приведенная выше реализация не идеальна: вам нужно проверить null
s и имена контроллеров, которые не найдены в конфигурации, и т. Д. Это должно как минимум послужитьначать с подхода, который достаточно гибок.