ASP Net Core - Как сделать наследование маршрутов на нескольких уровнях? - PullRequest
2 голосов
/ 27 апреля 2020

Я работаю над API, и у меня есть следующая проблема

У меня есть абстрактный ApiController, например:

public abstract class ApiController<TService> : ApiController
    where TService : BaseService
{
    #region Fields

    /// <summary>
    /// Data manager
    /// </summary>
    protected TService Service { get; } = ServiceCollectionHelper.GetElementFromDependencyInjection<TService>();

    #endregion

    #region Constructors

    #endregion
}

[ApiController]
[Authorize]
[Produces("application/json")]
[Route("api", Name = "BaseApiRoute")]
public abstract class ApiController : ControllerBase
{
}

У меня есть несколько контроллеров, которые наследуют ApiController<TService>, или ApiController.

Пример контроллеров:

[Route("[controller]")]
public class RegionsController : ApiController<RegionService>
{
    #region Fields

    #endregion

    #region Constructor

    #endregion

    #region Methods

    /// <summary>
    /// Get the regions
    /// </summary>
    /// <param name="includeDepartments">Include the region departments</param>
    /// <returns>Regions</returns>
    [HttpGet]
    [ProducesResponseType(typeof(IEnumerable<DepartmentDTO>), StatusCodes.Status200OK)]
    public async Task<ActionResult<IEnumerable<RegionDTO>>> GetAsync(bool includeDepartments = false)
    {
        return this.Ok(await this.Service.GetAsync(includeDepartments));
    }

    #endregion
}

Обычно маршрут для метода RegionsController.GetAsync должен быть /api/regions с методом GET, но это /regions

Почему наследование не работает и как это исправить, чтобы иметь префикс /api для всех маршрутов?

Я пытался заменить [Route("/api")] на [Area("/api')], но это не работал.

Спасибо

1 Ответ

1 голос
/ 27 апреля 2020

Если вы определяете [Route("[controller]")] для RegionsController, он переопределяет базовый маршрут.

Вместо этого вы можете определить маршрут с заменой токена на базовом контроллере, например:

[ApiController]
[Authorize]
[Produces("application/json")]
[Route("api/[controller]", Name = "BaseApiRoute_[controller]")]
public abstract class ApiController : ControllerBase
{
}

См. замена токена и наследование маршрута для получения дополнительной информации.

Маршруты атрибутов также можно комбинировать с наследованием. Это мощно в сочетании с заменой токена. Замена токенов также применяется к именам маршрутов, определенным атрибутами-маршрутами.

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