No curso " https://cursos.alura.com.br/course/asp-net-core-web-ap" é desenvolvido um projeto Asp.Net Core Web API e todos os controllers possuem no seu construtor o parâmetro IRepository, mas eu não entendi onde que é feito a chamada do LivrosController por exemplo e passado o parâmetro do tipo IRepository.
O WebAPI se encarrega disso automático, foi passado o parâmetro na chamado em algum lugar e não encontrei? Se eu quiser mudar para um ILivrosRepository também funcionará?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Alura.ListaLeitura.Modelos;
using Alura.ListaLeitura.Persistencia;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Formatters;
namespace Alura.ListaLeitura.Api.Controllers
{
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class LivrosController : ControllerBase
{
private readonly IRepository<Livro> _repo;
public LivrosController(IRepository<Livro> repository)
{
_repo = repository;
}
[HttpGet]
public IActionResult ListaDeLivros()
{
var lista = _repo.All.Select(l => l.ToApi()).ToList();
return Ok(lista);
}
[HttpGet("{id}")]
public IActionResult Recuperar(int id)
{
var model = _repo.Find(id);
if (model == null)
{
return NotFound();
}
return Ok(model.ToApi());
}
[HttpGet("{id}/capa")]
public IActionResult ImagemCapa(int id)
{
byte[] img = _repo.All
.Where(l => l.Id == id)
.Select(l => l.ImagemCapa)
.FirstOrDefault();
if (img != null)
{
return File(img, "image/png");
}
return File("~/images/capas/capa-vazia.png", "image/png");
}
[HttpPost]
public IActionResult Incluir([FromBody] LivroUpload model)
{
if (ModelState.IsValid)
{
var livro = model.ToLivro();
_repo.Incluir(livro);
var uri = Url.Action("Recuperar", new { id = livro.Id });
return Created(uri, livro); //201
}
return BadRequest();
}
[HttpPut]
public IActionResult Alterar([FromBody] LivroUpload model)
{
if (ModelState.IsValid)
{
var livro = model.ToLivro();
if (model.Capa == null)
{
livro.ImagemCapa = _repo.All
.Where(l => l.Id == livro.Id)
.Select(l => l.ImagemCapa)
.FirstOrDefault();
}
_repo.Alterar(livro);
return Ok(); //200
}
return BadRequest();
}
[HttpDelete("{id}")]
public IActionResult Remover(int id)
{
var model = _repo.Find(id);
if (model == null)
{
return NotFound();
}
_repo.Excluir(model);
return NoContent(); //203
}
}
}