Можете ли вы использовать базовые классы generi c в ASP Net Core Controllers? - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь использовать абстрактный базовый класс с обобщениями на ASP Net Базовом контроллере. В то время как код строится, конечные точки возвращают 404 и не появляются в документах о чванстве.

Когда я удаляю базовый класс generi c, я могу видеть контроллер в документах, но тогда мне придется скопировать и вставить несколько версий контроллера, которых я пытаюсь избежать.

Есть какие-нибудь предложения о том, чего мне не хватает?

ЭТОТ КОНТРОЛЛЕР РАБОТАЕТ

[Route("/testconcrete/employees")]
public class TestController : ControllerBase
{
    private readonly IUserService<TechDevsEmployee> _userService;

    public TestController(IUserService<TechDevsEmployee> userService)
    {
        _userService = userService;
    }

    [HttpGet("{userId}")]
    public async Task<ActionResult<User>> GetUserById([FromRoute] Guid userId)
    {
        var result = await _userService.FindById(userId);
        return new OkObjectResult(result);
    }
}

ЭТОТ КОНТРОЛЛЕР НЕ РАБОТАЕТ (404)

[Route("/testgeneric/employees")]
public class TechDevsEmployeeController<TechDevsEmployee> : UserController<TechDevsEmployee> where TechDevsEmployee : IUser, IClientEntity
{
    public TechDevsEmployeeController(IUserService<TechDevsEmployee> userService) : base(userService)
    {
    }
}

БАЗА КЛАСС

public abstract class UserController<T> : ControllerBase where T : IUser, IClientEntity
{
    private readonly IUserService<T> _userService;

    public UserController(IUserService<T> userService)
    {
        _userService = userService;
    }

    [HttpGet("{userId}")]
    public async Task<ActionResult<User>> GetUserById([FromRoute] Guid userId)
    {
        var result = await _userService.FindById(userId);
        return new OkObjectResult(result);
    }
}

Ответы [ 2 ]

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

Я верю, что в своем определении подкласса вы объявили обобщенный c тип TechDevsEmployee в сигнатуре класса. Подкласс не должен указывать это, вы можете указать тип, который вы хотите, чтобы BaseClass использовал напрямую, например:

[Route("/testgeneric/employees")]
public class TechDevsEmployeeController : UserController<TechDevsEmployee>
{
    public TechDevsEmployeeController(IUserService<TechDevsEmployee> userService) 
        : base(userService)
    {
    }
}
0 голосов
/ 01 апреля 2020

Как упоминает kyleJ в своем ответе, вы не можете иметь параметр generi c для самого конкретного класса. MVC не может угадать, какой тип вы хотите использовать для TechDevsEmployee. Если у вас много подклассов TechDevsEmployee, вам нужно создать отдельный подконтроллер для каждого подкласса и удалить параметр generi c из подкласса, как указано в другом ответе { ссылка }

...