É possível ter uma controller em uma API sem [ApiController] | Artigo .NET
- É possível ter uma controller em uma API sem
[ApiController]| Artigo .NET
🧭 Controller sem ControllerBase e sem [ApiController] no ASP.NET Core
🧩 Introdução
Recentemente, em uma entrevista técnica, surgiu uma pergunta que pegou muitos desenvolvedores de surpresa:
“É possível criar um controller no ASP.NET Core sem herdar de
ControllerBasee sem usar o atributo[ApiController]?”
A resposta é sim, é perfeitamente possível — embora não seja a prática comum em projetos reais.
Vamos entender o porquê.
⚙️ Como o ASP.NET Core descobre Controllers
Quando uma aplicação ASP.NET Core é iniciada, o framework procura automaticamente por classes que atendam a certas convenções.
Por padrão, um Controller é qualquer classe pública cujo nome termina com “Controller” e que possui métodos públicos. Esses métodos são automaticamente tratados como Actions, que podem responder a requisições HTTP.
Exemplo simples de como o ASP.NET Core faz isso:
public class HelloController
{
public string Get() => "Olá do controller sem base!";
}
Esse código funciona sem herdar de ControllerBase e sem o atributo [ApiController].
O framework ainda assim o reconhecerá como um controller — desde que esteja devidamente configurado no Startup.cs ou Program.cs com MapControllers() e AddControllers().
🧠 Mas então por que usamos ControllerBase e [ApiController]?
A herança de ControllerBase não é obrigatória, mas facilita a vida do desenvolvedor.
Ela fornece vários métodos auxiliares e propriedades úteis, como:
Ok(),BadRequest(),NotFound()ModelStateRequesteResponseUser,HttpContext- Suporte ao
[FromBody],[FromQuery],[FromRoute]
Da mesma forma, o atributo [ApiController] ativa comportamentos automáticos como:
- Validação automática de modelo (
ModelState). - Binding de parâmetros automático e mais consistente.
- Respostas de erro padronizadas em JSON.
Sem eles, você precisaria lidar com tudo manualmente.
🧱 Exemplo: Controller funcional sem ControllerBase e sem [ApiController]
using Microsoft.AspNetCore.Mvc;
namespace DemoApp.Controllers
{
public class SimpleController
{
[HttpGet("hello")]
public string Hello()
{
return "Hello from a plain controller!";
}
}
}
Este controller:
- Será descoberto e mapeado corretamente.
- Retornará
"Hello from a plain controller!"quando acessado viaGET /hello. - Não possui nenhuma das conveniências de
ControllerBase(comoOk()ouBadRequest()).
💡 Conclusão
Portanto, sim, um Controller no ASP.NET Core pode existir sem herdar de ControllerBase e sem [ApiController], porque a descoberta de Controllers é baseada em convenções e não em herança.
Entretanto, herdar de ControllerBase é altamente recomendado para ter acesso a recursos prontos e melhorar a manutenção do código.