【问题标题】:Can you use generic base classes in ASP Net Core Controllers?您可以在 ASP Net Core 控制器中使用通用基类吗?
【发布时间】:2020-07-10 03:13:23
【问题描述】:

我正在尝试在 ASP Net Core 控制器上使用带有泛型的抽象基类。在代码构建时,端点返回 404 并且不会出现在 swagger 文档中。

当我删除通用基类时,我可以在文档中看到控制器,但我必须复制并粘贴多个版本的控制器,这是我试图避免的。

对我缺少什么有什么建议吗?

这个控制器工作

[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);
    }
}

【问题讨论】:

标签: c# asp.net asp.net-core asp.net-web-api .net-core


【解决方案1】:

我相信在您的子类定义中,您已经在类签名中声明了一个泛型类型TechDevsEmployee。子类不需要指定这个,你可以像这样直接指定你希望BaseClass使用的类型:

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

【讨论】:

    【解决方案2】:

    正如 kyleJ 在他的回答中提到的,您不能在具体类本身上有一个通用参数。 MVC 无法猜测你想为TechDevsEmployee 使用什么类型。如果你有很多TechDevsEmployee的子类,你需要为每个子类创建一个单独的子控制器,并从子类中删除泛型参数,如另一个答案https://stackoverflow.com/a/60920600/25338中所述

    【讨论】:

      猜你喜欢
      • 2021-06-25
      • 1970-01-01
      • 1970-01-01
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多