Skip to main content

É 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 ControllerBase e 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()
  • ModelState
  • Request e Response
  • User, 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 via GET /hello.
  • Não possui nenhuma das conveniências de ControllerBase (como Ok() ou BadRequest()).

💡 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.