Asp.Net Core - наследует контроллер и его маршруты, но переопределяет методы - PullRequest
0 голосов
/ 14 мая 2019

У меня есть сгенерированный контроллер, использующий mvn, который выглядит следующим образом ...

    public class TeamApiController : ControllerBase
    { 
        /// <summary>
        /// 
        /// </summary>
        /// <param name="teamID"></param>
        /// <response code="200">Success</response>
        [HttpGet]
        [Route("/api/Team/{teamID}/members")]
        [ValidateModelState]
        [SwaggerOperation("GetStaffMembersByTeamID")]
        [SwaggerResponse(statusCode: 200, type: typeof(TeamDetails), description: "Success")]
        public virtual IActionResult GetStaffMembersByTeamID([FromRoute][Required]int? teamID)
        { 
             // return null;
        }
    }

Я хочу унаследовать этот контроллер и реализовать свои собственные методы

 public class TeamImpController : TeamApiController
    {
        private readonly IStaffService staffService;
        public TeamImpController(IStaffService staffService)
        {
            this.staffService = staffService;
        }

        public override IActionResult GetStaffMembersByTeamID([FromRoute][Required]int? teamID)
        {
            // write my override method
        }
    }

все компилируется, но при запуске получается

AmbiguousActionException: Multiple actions matched. The following actions matched route data and had all constraints satisfied:

В основном я пытаюсь наследовать маршруты сгенерированного файла, но переопределяю методы

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Вам необходимо определить TeamApiController как класс abstract, чтобы он не распознавался как Controller. При этом вам нужно будет переместить все атрибуты в производный класс. Итак, ваш TeamApiController станет

public abstract class TeamApiController : ControllerBase
{ 
    /// <summary>
    /// 
    /// </summary>
    /// <param name="teamID"></param>
    /// <response code="200">Success</response>
    public virtual IActionResult GetStaffMembersByTeamID(int? teamID)
    { 
         // return null;
    }
}

И ваш TeamTmpController станет

public class TeamTmpController : TeamApiController
{
    private readonly IStaffService staffService;
    public TeamImpController(IStaffService staffService)
    {
        this.staffService = staffService;
    }

    [HttpGet]
    [Route("/api/Team/{teamID}/members")]
    [ValidateModelState]
    [SwaggerOperation("GetStaffMembersByTeamID")]
    [SwaggerResponse(statusCode: 200, type: typeof(TeamDetails), description: "Success")]
    public override IActionResult GetStaffMembersByTeamID([FromRoute][Required]int? teamID)
    {
        // write my override method
    }
}

Если у вас есть другой контроллер, унаследованный от TeamApiController, и вам нужны базовые функции. Просто вызовите return base.GetStaffMembersByTeamID или другие методы по мере необходимости. Надеюсь, это поможет.

Примечание : это проверенный подход, который я использовал в одном из моих проектов. Я также протестировал приведенный выше код, просто чтобы убедиться, что он работает.

0 голосов
/ 14 мая 2019

Как я вижу здесь, нет необходимости наследовать от TeamApiController, так как два метода будут иметь разную реализацию с одинаковыми параметрами, также вы можете отделить реализацию от метода службы или домена и просто вызвать реализацию из контроллера

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