Como recomendación la propiedad del servicio debería ser declarada como protected y de solo lectura de la siguiente forma
protected readonly ITareasService _tareasService;
es un estándar que recomienda .Net
Introducción a API en .NET
Domina las API con .NET
Prerrequisitos
¿Qué es una API?
¿Qué es REST?
Creando tu primera API con .NET
Funcionamiento de una API en .NET
Consumiendo API desde Postman
Análisis del template para APIs de .NET
Atributos para verbos HTTP
Manejo de rutas
Minimal API vs. Web API
Arquitectura y configuración
¿Qué son los middlewares?
Creando un nuevo middleware
Inyección de dependencias
Agregando Logging a API
Documentando API con Swagger
Manipulación de datos con Entity Framework
Agregando librerías para Entity Framework
Configuración de Entity framework y clases base
Creación de servicios
Inyectando servicios como dependencia
Creando controladores
Probando API con una base de datos SQL server
Outro
Retrospectiva: APIs con .NET
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Miguel Teheran
Aportes 11
Preguntas 9
Como recomendación la propiedad del servicio debería ser declarada como protected y de solo lectura de la siguiente forma
protected readonly ITareasService _tareasService;
es un estándar que recomienda .Net
Hola, para quienes al momento de compilar el codigo se les presenta el error:
Unhandled exception. System.AggregateException: Some services are not able to be constructed (Error while validating the service descriptor ‘ServiceType: webapi.Services.ICategoriaService Lifetime: Scoped ImplementationType: webapi.Services.CategoriaService’: Unable to resolve service for type ‘webapi.TareasContext’ while attempting to activate ‘webapi.Services.CategoriaService’.)
—> System.InvalidOperationException: Error while validating the service descriptor ‘ServiceType: webapi.Services.ICategoriaService Lifetime: Scoped ImplementationType: webapi.Services.CategoriaService’: Unable to resolve service for type ‘webapi.TareasContext’ while attempting to activate ‘webapi.Services.CategoriaService’.
No es un error en el codigo en realidad, ya que al momento de seguir las clases siguientes y agregar el codigo que falta este “error” se soluciona. Muy segurmente no funciona por la falta de codigo adicional
CategoriaController
using Microsoft.AspNetCore.Mvc;
using webapi.Models;
using webapi.Services;
namespace webapi.Controllers;
[Route("api/[controller]")]
public class CategoriaController : ControllerBase
{
ICategoriaService categoriaService;
public CategoriaController(ICategoriaService service) {
categoriaService = service;
}
[HttpGet]
public IActionResult Get() {
return Ok(categoriaService.Get());
}
[HttpPost]
public IActionResult Post([FromBody] Categoria categoria) {
categoriaService.Save(categoria);
return Ok();
}
[HttpPut("{id}")]
public IActionResult Put(Guid id, [FromBody] Categoria categoria) {
categoriaService.Update(id, categoria);
return Ok();
}
[HttpDelete("{id}")]
public IActionResult Delete(Guid id) {
categoriaService.Delete(id);
return Ok();
}
}
TareaController
using Microsoft.AspNetCore.Mvc;
using webapi.Models;
using webapi.Services;
namespace webapi.Controllers;
[Route("api/[controller]")]
public class TareaController : ControllerBase
{
ITareaService tareaService;
public TareaController(ITareaService service) {
tareaService = service;
}
[HttpGet]
public IActionResult Get() {
return Ok(tareaService.Get());
}
[HttpPost]
public IActionResult Post([FromBody] Tarea tarea) {
tareaService.Save(tarea);
return Ok();
}
[HttpPut("{id}")]
public IActionResult Put(Guid id, [FromBody] Tarea tarea) {
tareaService.Update(id, tarea);
return Ok();
}
[HttpDelete("{id}")]
public IActionResult Delete(Guid id) {
tareaService.Delete(id);
return Ok();
}
}
Faltó explicar en el curso los niveles en una Api REST
Excelente buena explicacion como siempre!
Bien explicado.
VSC me marcaba error porque no tenía los métodos en la Interfaz de TareasService, solo asegurense de que estén definidos:
public interface ITareasService
{
IEnumerable<Tarea> Get();
Task Save(Tarea tarea);
Task Update(Guid id, Tarea tarea);
Task Delete(Guid id);
}
Y ya con eso queda el archivo de TareaController:
using Microsoft.AspNetCore.Mvc;
using webapi.Models;
using webapi.Services;
namespace webapi.Controllers;
[Route("/api/[controller]")]
public class TareaController : ControllerBase
{
protected readonly ITareasService _tareasService;
public TareaController(ITareasService service)
{
_tareasService = service;
}
[HttpGet]
public IActionResult Get()
{
return Ok(_tareasService.Get());
}
[HttpPost]
public IActionResult Post([FromBody] Tarea tarea)
{
_tareasService.Save(tarea);
return Ok("Tarea creada");
}
[HttpPut("{id}")]
public IActionResult Put(Guid id, [FromBody] Tarea tarea)
{
_tareasService.Update(id, tarea);
return Ok("Tarea actualizada");
}
[HttpDelete("{id}")]
public IActionResult Delete(Guid id)
{
_tareasService.Delete(id);
return Ok("Tarea eliminada");
}
}
![](
![](
Mi TareaController 😊
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using webapi.Models;
using webapi.Services;
namespace proyectapirest.Controllers;
[Route("api/[controller]")]
public class TareaController : ControllerBase
{
ITareasService tareasService;
public TareaController(TareasService service)
{
tareasService = service;
}
[HttpGet]
public IActionResult Get()
{
return Ok(tareasService.Get());
}
[HttpPost]
public IActionResult Post([FromBody] Tarea tarea)
{
tareasService.Save(tarea);
return Ok();
}
[HttpPut("{id}")]
public IActionResult Post(Guid id, [FromBody] Tarea tarea)
{
tareasService.Update(id, tarea);
return Ok();
}
[HttpDelete("{id}")]
public IActionResult Post(Guid id)
{
tareasService.Delete(id);
return Ok();
}
}
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?