Oi, Thiago, tudo bem?
Não é adequado acessar os dados diretamente a partir da view, pois isso viola o princípio de separação de responsabilidades do padrão MVC.
O mais adequado é passar os dados para a view a partir do Controller.
No projeto do curso, usamos o padrão Repository para o acesso aos dados. Um repositório pode acessar os dados no banco utilizando um mecanismo de mapeamento objeto-relacional, como fizemos no curso:
1) Primeiro, quem exibe os dados é a View. Uma view do MVC precisa saber qual a origem do modelo de dados. Isto é, qual classe vai fornecer todos os dados de que a view precisa para exibir as informações na página. Para issocriamos uma diretiva @model
na view de Carrossel
.
https://github.com/alura-cursos/ASPNETCore20/blob/master/Aulas/Aula5/CasaDoCodigo/Views/Pedido/Carrossel.cshtml
@model List<Produto>;
2) Quem fornece os dados para a view é o Controller. E ele faz isso no método Carrossel
, que tem o mesmo nome da view. Note como o controller está buscando os dados a partir de produtoRepository.GetProdutos()
.
https://github.com/alura-cursos/ASPNETCore20/blob/master/Aulas/Aula5/CasaDoCodigo/Controllers/PedidoController.cs
public class PedidoController : Controller
.
.
.
public IActionResult Carrossel()
{
return View(produtoRepository.GetProdutos());
}
3) O ProdutoRepository
possui o método GetProdutos()
, que retorna a lista de produtos do nosso catálogo através das entidades do repositório, com o método dbSet.ToList();
.
https://github.com/alura-cursos/ASPNETCore20/blob/master/Aulas/Aula5/CasaDoCodigo/Repositories/BaseRepository.cs
public class ProdutoRepository : BaseRepository<Produto>, IProdutoRepository
.
.
.
public IList<Produto> GetProdutos()
{
return dbSet.ToList();
}
4) O dbSet
é um conjunto de dados que está conectado com o banco de dados através do mecanismo de mapeamento de objetos (ORM) do Entity Framework Core. Esse mecanismo vai fazer a tabela do banco de dados PRODUTOS
ser relacionada à entidade Produto
do modelo.
O dbSet
é um campo da classe-base BaseRepository
:
https://github.com/alura-cursos/ASPNETCore20/blob/master/Aulas/Aula5/CasaDoCodigo/Startup.cs
public abstract class BaseRepository<T> where T : BaseModel
.
.
.
protected readonly DbSet<T> dbSet;
public BaseRepository(ApplicationContext contexto)
{
this.contexto = contexto;
dbSet = contexto.Set<T>();
}
5) Como o controller PedidoController
recebe o parâmetro IProdutoRepository
no seu construtor como uma instância da classe concreta ProdutoRepository
?
O próprio sistema de Injeção de Dependência do ASP.NET Core faz isso. Mas antes, foi necessário configurar o mapeamento entre a interface IProdutoRepository
e a classe ProdutoRepository
:
https://github.com/alura-cursos/ASPNETCore20/blob/master/Aulas/Aula5/CasaDoCodigo/Startup.cs
public void ConfigureServices(IServiceCollection services)
.
.
.
services.AddTransient<IProdutoRepository, ProdutoRepository>();