No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Creación de servicios

18/22
Recursos

Aportes 19

Preguntas 8

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Al minuto 7:42, cuando estamos verificando la categoría actual, es preferible seguir la estrategia guard. Consiste básicamente en realizar validaciones y romper/interrumpir la ejecución antes de la lógica principal:

if(categoriaActual == null)
{
	return NotFound();
}
// Resto de la lógica

De esta manera evitamos el uso de else y el código es más legible.

CategoriaService


using webapi.Models;

namespace webapi.Services;

public class CategoriaService : ICategoriaService
{
    TareasContext context;
    public CategoriaService(TareasContext dbContext) {
        context = dbContext;
    }
    public IEnumerable<Categoria> Get(){
        return context.Categorias;
    }

    public async Task Save(Categoria categoria) {
        context.Add(categoria);
        await context.SaveChangesAsync();
    }

    public async Task Update(Guid id, Categoria categoria) {
        var categoriaActual = context.Categorias.Find(id);
        if (categoriaActual != null) {
            categoriaActual.Nombre = categoria.Nombre;
            categoriaActual.Descripcion = categoria.Descripcion;
            categoriaActual.Peso = categoria.Peso;

            await context.SaveChangesAsync();
        }

    }

    public async Task Delete(Guid id) {
        var categoriaActual = context.Categorias.Find(id);
        if (categoriaActual != null) {
            context.Remove(categoriaActual);
            await context.SaveChangesAsync();
        }
        
    }
}

public interface ICategoriaService
{
    IEnumerable<Categoria> Get();
    Task Save(Categoria categoria);
    Task Update(Guid id, Categoria categoria);
    Task Delete(Guid id);

}

TareaService


using webapi.Models;

namespace webapi.Services;

public class TareaService : ITareaService
{
    TareasContext context;
    public TareaService(TareasContext dbContext) {
        context = dbContext;
    }
    public IEnumerable<Tarea> Get(){
        return context.Tareas;
    }

    public async Task Save(Tarea tarea) {
        context.Add(tarea);
        await context.SaveChangesAsync();
    }

    public async Task Update(Guid id, Tarea tarea) {
        var tareaActual = context.Tareas.Find(id);
        if (tareaActual != null) {
            tareaActual.CategoriaId = tarea.CategoriaId;
            tareaActual.Titulo = tarea.Titulo;
            tareaActual.PrioridadTarea = tarea.PrioridadTarea;
            tareaActual.Descripcion = tarea.Descripcion;

            await context.SaveChangesAsync();
        }

    }

    public async Task Delete(Guid id) {
        var tareaActual = context.Tareas.Find(id);
        if (tareaActual != null) {
            context.Remove(tareaActual);
            await context.SaveChangesAsync();
        }
        
    }
}

public interface ITareaService
{
    IEnumerable<Tarea> Get();
    Task Save(Tarea tarea);
    Task Update(Guid id, Tarea tarea);
    Task Delete(Guid id);

}

En el servicio de categoría hay un error al hacer el Update, se están actualizando los datos de categoria con categoría. Y deberían actualizarse categoriaActual con los datos de categoria.

Adjunto mi clase Update de Categoria.

    public async Task Update(Guid id, Categoria categoria)
    {
        var categoriaActual = context.Categorias.Find(id);
        if (categoriaActual != null)
        {
            categoriaActual.Nombre = categoria.Nombre;
            categoriaActual.Descripcion = categoria.Descripcion;
            categoriaActual.Peso = categoria.Peso;

            await context.SaveChangesAsync();
        }

    }

Mi TareaService 😊

using webapi.Models;
namespace webapi.Services;


public class TareasService : ITareasService
{

    TareasContext context;
    public TareasService(TareasContext dbcontext)
    {
        context = dbcontext;
    }

    public IEnumerable<Tarea> Get()
    {
        return context.Tareas;
    }
    public async Task Save(Tarea tarea)
    {
        context.Add(tarea);
        await context.SaveChangesAsync();
    }

    public async Task Update(Guid id, Tarea tarea)
    {
        var tareaActual = context.Tareas.Find(id);
        if (tareaActual != null)
        {
            tareaActual.CategoriaId = tarea.CategoriaId;
            tareaActual.Titulo = tarea.Titulo;
            tareaActual.Descripcion = tarea.Descripcion;
            tareaActual.PrioridadTarea = tarea.PrioridadTarea;
            tareaActual.FechaCreacion = tarea.FechaCreacion;
            tareaActual.Categoria = tarea.Categoria;
            await context.SaveChangesAsync();
        }
    }

    public async Task Delete(Guid id)
    {
        var tareaActual = context.Tareas.Find(id);
        if (tareaActual != null)
        {
            context.Remove(tareaActual);
            await context.SaveChangesAsync();
        }
    }
}

public interface ITareasService
{
    IEnumerable<Tarea> Get();
    Task Save(Tarea tarea);
    Task Update(Guid id, Tarea tarea);
    Task Delete(Guid id);
}

Excelente clase

En el contexto de una API desarrollada con ASP.NET Core, un "servicio" se refiere a una clase o componente que encapsula la lógica de negocio o funcionalidad específica de la aplicación. Estos servicios están diseñados para realizar tareas específicas y proporcionar funcionalidades reutilizables que pueden ser utilizadas por diferentes partes de la aplicación. En ASP.NET Core, la arquitectura típica sigue el patrón de Inyección de Dependencias (Dependency Injection). Esto significa que los servicios necesarios para una operación específica se inyectan en lugar de ser instanciados directamente dentro de una clase. La Inyección de Dependencias facilita la gestión de las dependencias y la modularidad del código. Aquí hay algunas características clave de los servicios en el contexto de una API ASP.NET Core: 1. **Encapsulación de Lógica de Negocio:** Los servicios se utilizan para encapsular y organizar la lógica de negocio de la aplicación. Por ejemplo, un servicio puede encargarse de la autenticación, otro de la persistencia de datos en una base de datos, y otro de la lógica de negocio específica de un controlador. 2. **Reutilización de Código:** Al dividir la lógica de la aplicación en servicios, se fomenta la reutilización de código. Varios controladores o componentes pueden utilizar el mismo servicio para realizar operaciones similares. 3. **Inyección de Dependencias:** En ASP.NET Core, los servicios se registran en el contenedor de inversión de control (IoC) y se inyectan en las clases que los necesitan. Esto facilita la gestión de dependencias y mejora la modularidad del código. 4. **Testabilidad:** La división de la lógica en servicios facilita la prueba unitaria. Puedes escribir pruebas unitarias para cada servicio de forma independiente, lo que ayuda a garantizar que cada componente de la aplicación funcione correctamente. Un ejemplo práctico sería un servicio de gestión de usuarios. Este servicio podría contener métodos para crear usuarios, autenticar usuarios, recuperar información de usuario, etc. Luego, estos métodos pueden ser utilizados por los controladores de la API para realizar operaciones relacionadas con usuarios. En resumen, en el contexto de una API ASP.NET Core, un servicio es un componente que encapsula la lógica de negocio, promoviendo la reutilización de código, la inyección de dependencias y la testabilidad.
Buenas, Tengo este error al intentar crear el save, ¿alguien tiene idea a que se debe?![](https://static.platzi.com/media/user_upload/err-b507470b-571c-4ba2-b1d3-6de61baa1cd9.jpg) ![]()

Vengo de algun futuro, para quien empiece a ver arquitectura limpia, esto es base para entender cuando se hablan de repositorio e interfaces , ademas esto esta en el mismo curso de miguel de programacion deobjetos, sobre las clases abstractas ,
saludos

Aporte de Tareas

![](

![](

![](

Si alguien quiere que le aparezca estas ayudas, solo instalece IntelliCode en su VS Code.
.
.

```js Tareas: using Microsoft.EntityFrameworkCore; using Microsoft.Identity.Client; using webapi; using webapi.Models; namespace webapi.Services { public class TareasService : ITareasService { TareasContext context; public TareasService(TareasContext dbcontext) { context = dbcontext; } public IEnumerable<Tarea> Get() { return context.Tareas; } public async Task Save(Tarea tarea) { context.Add(tarea); await context.SaveChangesAsync(); } public async Task Update(Guid id, Tarea tarea) { var tareaActual = context.Tareas.Find(id); if(tareaActual != null) { tareaActual.Titulo = tarea.Titulo; tareaActual.Descripcion = tarea.Descripcion; tareaActual.PrioridadTarea = tarea.PrioridadTarea; tareaActual.FechaCreacion = tarea.FechaCreacion; } context.Add(tarea); await context.SaveChangesAsync(); } public async Task Delete(Guid id, Tarea tarea) { var tareaActual = context.Tareas.Find(id); if(tareaActual != null) { context.Remove(tareaActual); await context.SaveChangesAsync(); } } } public interface ITareasService { IEnumerable<Tarea> Get(); Task Save(Tarea tarea); Task Update(Guid id, Tarea tarea); Task Delete(Guid id, Tarea tarea); } } ```using Microsoft.EntityFrameworkCore;using Microsoft.Identity.Client;using webapi;using webapi.Models; namespace webapi.Services{    public class TareasService : ITareasService    {        TareasContext context;        public TareasService(TareasContext dbcontext)        {            context = dbcontext;        }        public IEnumerable\<Tarea> Get()        {            return context.Tareas;        }        public async Task Save(Tarea tarea)        {            context.Add(tarea);            await context.SaveChangesAsync();        }        public async Task Update(Guid id, Tarea tarea)        {            var tareaActual = context.Tareas.Find(id);             if(tareaActual != null)            {                tareaActual.Titulo = tarea.Titulo;                tareaActual.Descripcion = tarea.Descripcion;                tareaActual.PrioridadTarea = tarea.PrioridadTarea;                tareaActual.FechaCreacion = tarea.FechaCreacion;            }            context.Add(tarea);            await context.SaveChangesAsync();        }        public async Task Delete(Guid id, Tarea tarea)        {            var tareaActual = context.Tareas.Find(id);             if(tareaActual != null)            {                context.Remove(tareaActual);                await context.SaveChangesAsync();            }        }    }    public interface ITareasService    {        IEnumerable\<Tarea> Get();               Task Save(Tarea tarea);        Task Update(Guid id, Tarea tarea);        Task Delete(Guid id, Tarea tarea);      }}
Hola Compañeros/as! Les comparto cómo realicé el reto de esta clase: ```js public class TareasService:ITareasService { TareasContext context; public TareasService(TareasContext dbcontext) { context = dbcontext; } public IEnumerable<Tarea> Get() { return context.Tareas; } public async Task Save(Tarea tarea) { context.Add(tarea); await context.SaveChangesAsync(); } public async Task Update(Guid id, Tarea tarea) { var tareaActual = context.Tareas.Find(id); if(tareaActual != null) { tareaActual.Titulo = tarea.Titulo; tareaActual.Descripcion = tarea.Descripcion; tareaActual.PrioridadTarea = tarea.PrioridadTarea; tareaActual.FechaCreacion = tarea.FechaCreacion; tareaActual.Resumen = tarea.Resumen; tareaActual.CategoriaId = tarea.CategoriaId; await context.SaveChangesAsync(); } } public async Task Delete(Guid id) { var tareaActual = context.Tareas.Find(id); if(tareaActual != null) { context.Remove(tareaActual); await context.SaveChangesAsync(); } } } public interface ITareasService { IEnumerable<Tarea> Get(); Task Save(Tarea tarea); Task Update(Guid id, Tarea tarea); Task Delete(Guid id); } ```
Los que tengan problemas con los métodos save. update y delete, cambien el método asíncrono de SaveChangeAsync() por un método síncrono context.SaveChange(); eso solucionó todos mis problemas.
buaaaa me rindo!, no se porque después de la ejecución el update solo me funciona una o dos veces, luego deja de funcionar y tengo que reiniciar la ejecución para que vuelva a funcionar... me quedo loco

Reto con TareasService:

using webapi.Models;
namespace webapi.Services;

public class TareasService : ITareasService
{
  TareasContext context;

  public TareasService(TareasContext dbContext)
  {
    context = dbContext;
  }

  public IEnumerable<Tarea> Get()
  {
    return context.Tareas;
  }

  public async Task Save(Tarea tarea)
  {
    context.Tareas.Add(tarea);
    await context.SaveChangesAsync();
  }

  public async Task Update(Guid id, Tarea tarea)
  {
    var tareaActual = context.Tareas.Find(id);
    if (tareaActual != null)
    {
      tareaActual.Titulo = tarea.Titulo;
      tareaActual.Descripcion = tarea.Descripcion;
      tareaActual.PrioridadTarea = tarea.PrioridadTarea;
      tareaActual.FechaCreacion = tarea.FechaCreacion;
      tareaActual.Categoria = tarea.Categoria;

      await context.SaveChangesAsync();
    }
  }

  public async Task Delete(Guid id)
  {
    var tareaActual = context.Tareas.Find(id);
    if (tareaActual != null)
    {
      context.Tareas.Remove(tareaActual);
      await context.SaveChangesAsync();
    }
  }
}

public interface ITareasService
{
  IEnumerable<Tarea> Get();
}

   public async Task Save(Tarea tarea)
    {
        context.Add(tarea);
        await context.SaveChangesAsync();
    }

    public async Task Update(Guid id, Tarea tarea)
    {
        var tareaActual = context.Tareas.Find(id);
        
        if(tareaActual != null)
        {
            tareaActual.CategoriaId = tarea.CategoriaId;
            tareaActual.Titulo = tarea.Titulo;
            tareaActual.Descripcion = tarea.Descripcion;
            tareaActual.PrioridadTarea = tarea.PrioridadTarea;
            tareaActual.FechaCreacion = tarea.FechaCreacion;
            tareaActual.Categoria = tarea.Categoria;
            tareaActual.Resumen = tarea.Resumen;

            await context.SaveChangesAsync();

        }
    }
     public async Task Delete(Guid id)
    {
        var tareaActual = context.Tareas.Find(id);
        
        if(tareaActual != null)
        {
            context.Remove(tareaActual);
            await context.SaveChangesAsync();

        }
    }
}

public interface ITareasService
{
    IEnumerable<Tarea> Get();
    Task Save(Tarea tarea);

    Task Update(Guid id, Tarea tarea);
    Task Delete(Guid id);

TareaServices

using WebAPICurso.Models;

namespace WebAPICurso.Services;

public class TareaServices : ITareaServices
{
    TareasContext _context;

    public TareaServices(TareasContext context)
    {
        _context = context;
    }

    public IEnumerable<Tarea> Get()
    {
        return _context.Tareas;
    }

    public async Task Save(Tarea tarea)
    {
        await _context.Tareas.AddAsync(tarea);
        _context.SaveChanges();
    }

    public async Task Update(Guid id, Tarea tarea)
    {
        var tareaActual = _context.Tareas.Find(id);

        if(tareaActual != null)
        {
            tareaActual.Titulo = tarea.Titulo;
            tareaActual.Descripcion = tarea.Descripcion;
            tareaActual.Usuario = tarea.Usuario;

            await _context.SaveChangesAsync();
        }
    }

    public async Task Delete(Guid id)
    {
        var tareaActual = _context.Tareas.Find(id);

        if(tareaActual != null)
        {
            _context.Tareas.Remove(tareaActual);

            await _context.SaveChangesAsync();
        }
    }

}

public interface ITareaServices
{
    IEnumerable<Tarea> Get();

    Task Save(Tarea tarea);

    Task Update(Guid id, Tarea tarea);

    Task Delete(Guid id);
}

Aquí dejo mi codigo, al cual comence usando la palabra reservada Task para tarea. Aprendan de los errores ajenos no hagan estas cosas sino tendran que estar asi igual que yo

using EF.Models;

namespace API.Service;
public class TaskService : ITaskService
{
    TaskContext context;

    public TaskService(TaskContext dbcontext)
    {
        context = dbcontext;
    }

    public IEnumerable<EF.Models.Task> Get()
    {
        return context.Tasks;
    }

    //Esta es la razon por la que no debemos usar palabras recervadas.
    public async System.Threading.Tasks.Task Save(EF.Models.Task Task)
    {
        context.Add(Task);
        await context.SaveChangesAsync();
    }

    public async System.Threading.Tasks.Task update(Guid id, EF.Models.Task Task)
    {
        var TaskPresent = context.Tasks.Find(id);
        if (TaskPresent != null)
        {
            TaskPresent.Title = Task.Title;
            TaskPresent.Description = Task.Description;
            TaskPresent.Date = Task.Date;
            TaskPresent.PriorityTask = Task.PriorityTask;

            await context.SaveChangesAsync();
        }
    }

    public async System.Threading.Tasks.Task Delete(Guid id)
    {
        var TaskPresent = context.Categoties.Find(id);
        if (TaskPresent != null)
        {
            context.Remove(TaskPresent);
            await context.SaveChangesAsync();
        }
    }

}

public interface ITaskService
{
    IEnumerable<EF.Models.Task> Get();
    System.Threading.Tasks.Task Delete(Guid id);
    System.Threading.Tasks.Task update(Guid id, EF.Models.Task Task);
    System.Threading.Tasks.Task Save(EF.Models.Task Task);

}
//Aqui pienso que es otra forma de buscar la categoria
 var categoriaActual= context.Categorias.FirstOrDefault(p=>p.CategoriaId==id);