Neste artigo veremos as diferenças entres os métodos AddMvc()
, AddMvcCore()
, AddControllers()
, AddControllersWithViews()
e AddRazorPages()
e quando utilizar cada um.
Tratando-se de uma reescrita do ASP.NET, a sua versão Core sempre foi pensada como um framework modular. Isso significa que as aplicações podem (e devem) adicionar apenas os recursos que utilizarão, o que irá otimizar a sua execução.
Infelizmente geralmente isso não é seguido, uma prova é a pouca adoção do método AddMvcCore()
.
Curso C# (C Sharp) - Introdução ao ASP.NET Core
Conhecer o cursoAddMvcCore
Caso seja um iniciante no ASP.NET Core, talvez nunca tenha ouvido falar no método AddMvcCore()
, mesmo na documentação oficial não é muito citado. Ele é um método de extensão de IServiceCollection
, que carrega apenas os recursos básicos de uma aplicação ASP.NET:
- Controllers: reconhece os controllers da aplicação;
- Rotas: adiciona as rotas padrão;
- CoreServiecs: adiciona os recursos básicos do ASP.NET.
Por adicionar os recursos básicos, qualquer outro recurso precisa ser adicionado “na mão”.
Por exemplo, crie uma aplicação web vazia e nela adicione um controller qualquer, com um método para a solicitação POST
:
[Route("api/[controller]")]
public class HomeController : Controller
{
[HttpPost]
public ActionResult Post([FromBody] Usuario user)
{
if(ModelState.IsValid)
return Ok(user);
else
return BadRequest(ModelState);
}
}
E um model com ao menos um campo obrigatório:
public class Usuario
{
public int Id { get; set; }
public string Nome { get; set; }
[Required]
public string User { get; set; }
[Required]
public string Senha { get; set; }
}
Caso no método ConfigureServices
seja adicionado apenas o método AddMvcCore()
:
public void ConfigureServices(IServiceCollection services) => services.AddMvcCore().AddNewtonsoftJson();
Obs.: Estou usando o .NET Core 3.0 Preview 4 e nesta versão as classes do Json.NET foram removidas da biblioteca padrão, assim, é necessário adicioná-las com o pacote Microsoft.AspNetCore.Mvc.NewtonsoftJson
e o método AddNewtonsoftJson()
utilizado acima.
O ASP.NET não irá validar os campos obrigatórios na solicitação POST:
Para que isso ocorra é necessário adicionar as Data Annotations:
public void ConfigureServices(IServiceCollection services) => services.AddMvcCore().AddNewtonsoftJson().AddDataAnnotations();
Com isso, a validação funcionará:
Claro que este nosso exemplo é simples, mas imagine ter que especificar autorização (a anotação [Authorize]
), CORS, etc. Por causa disso, geralmente utiliza-se o método AddMvc()
.
AddMvc
Assim como o AddMvcCore()
, o AddMvc()
é um método de extensão de IServiceCollection
que carrega praticamente todos os recursos necessários de uma aplicação ASP.NET, como:
- MvcCore: as dependências mínimas para executar uma aplicação ASP.NET Core MVC. Reconhece os controllers, realiza os bindings, adiciona das rotas padrão e os recursos básicos do ASP.NET;
- ApiExplorer: Habilita as API Help pages;
- Authorization: Habilita autorização;
- FormatterMappings: Traduz a extensão de um arquivo para content-type;
- Views: Habilita as Views;
- RazorViewEngine: Habilita o Razor nas Views (páginas salvas com a extensão cshtml);
- RazorPages: Habilita as Razor Pages (um tipo de aplicação do ASP.NET Core);
- TagHelper: Adiciona as tags helpers do Razor;
- Data Annotations: Habilita validação dos model por data annotations;
- Json Formatters: Adiciona parsers de JSON;
- CORS: Habilita o Cross-origin resource sharing (CORS).
Por adicionar vários recursos geralmente opta-se por definir apenas o método AddMvc()
, em detrimento do AddMvcCore()
.
Ao fazer esta mudança na nossa aplicação:
public void ConfigureServices(IServiceCollection services) => services.AddMvc().AddNewtonsoftJson();
Não é necessário especificar o Data Annotations, para que a validação seja realizada:
Mas caso esteja desenvolvendo uma aplicação Web API, o método AddMvc()
irá carregar recursos que não serão utilizados. Nesta situação, o ideal seria optar pelo AddMvcCore()
, mas se notar, até a versão 2.2 do ASP.NET a aplicação Web API criada pelo template padrão, também faz uso do método AddMvc()
.
Para alterar este comportamento, na versão 3.0 (que no momento da publicação deste artigo está em preview 4) foram adicionados os métodos AddControllers()
, AddControllersWithViews()
e AddRazorPages()
.
Curso C# (C Sharp) - Introdução ao ASP.NET Core
Conhecer o cursoAddControllers
Podemos dizer que o método AddControllers()
é uma evolução do AddMvcCore()
, já que foi criado visando preencher a lacuna que este método não conseguiu. Para isso, como o seu nome sugere, ele carrega recursos relacionados aos controllers:
- Controllers
- Model Binding;
- ApiExplorer;
- Authorization;
- CORS;
- Data Annotations;
- FormatterMappings.
Desta forma, se a aplicação não possuir uma interface, como a do nosso exemplo, que é uma Web API, pode-se optar por ele:
public void ConfigureServices(IServiceCollection services) => services.AddControllers().AddNewtonsoftJson();
Que todos os recursos relacionados a este tipo de aplicação serão carregados.
AddControllersWithViews
O método AddMvc()
não foi descontinuado na versão 3.0, mas foi adicionando o método AddControllersWithViews()
que carrega praticamente os mesmos recursos:
- MvcCore;
- ApiExplorer;
- Authorization;
- FormatterMappings;
- Views;
- RazorViewEngine;
- TagHelper;
- Data Annotations;
- Json Formatters;
- CORS.
O único que foi removido é o Razor Pages. Desta forma, uma aplicação ASP.NET MVC que não faça uso do Razor Pages deve optar por este método.
Para exemplificá-lo, é necessário adicionar uma view na aplicação:
@{
ViewData["Title"] = "Home Page";
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"]</title>
</head>
<body>
<p>Aplicativo de exemplo!</p>
</body>
</html>
Definir uma action no controller:
public IActionResult Index()
{
return View();
}
E definir as rotas no método Configure
:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
Com isso, a view será mostrada:
AddRazorPages
Razor Pages é um tipo de aplicação que permite adicionar códigos C# e HTML em um mesmo arquivo ou em arquivos separados, de uma forma muito similar ao antigo Web Forms. Por ser um aspecto de uma aplicação ASP.NET MVC, o AddRazorPages()
carrega quase os mesmos recursos do método AddControllersWithViews()
:
- RazorPages;
- MvcCore;
- Authorization;
- Views;
- RazorViewEngine;
- TagHelper;
- Data Annotations;
- Json Formatters.
Os recursos que não são carregados por padrão são:
- ApiExplorer;
- FormatterMappings;
- CORS.
Como o nome sugere este método deve ser utilizado em aplicações Razor Pages.
Mas caso a sua aplicação faça uso do Razor Pages e do ASP.NET MVC padrão, ele pode ser utilizado em conjunto com AddControllers()
ou AddControllersWithViews()
:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddControllersWithViews();
}
Que irá gerar o mesmo resultado do uso do AddMvc()
.
Conclusão
Por ser um framework modular, o ideal é que a aplicação ASP.NET carregue apenas os recursos que necessita. Comparando os métodos AddMvc()
, AddMvcCore()
, AddControllers()
, AddControllersWithViews()
e AddRazorPages()
; e vendo quais recursos cada um carrega, fica claro a função de cada um e quando utilizá-los de acordo com cada tipo de aplicação.
Assim, procure sempre utilizar o método que for mais adequado ao tipo de aplicação que está desenvolvendo, mesmo se o template padrão do ASP.NET sugerir outro método.