Hola , antes que nada muchísimas gracias por la explicación es super buena , queda muy claro de manera rápida y sencilla , mi pregunta es si este patrón de diseño es como si tuvieramos una arquitectura en 3 capas pero utilizando los principios SOLID ?
Sip, ya que el patrón de diseño de repositorio tiene una capa de aplicación y otra de datos, es similar a una arquitectura en tres capas que utiliza los principios SOLID.
Super, que buen video, me queda una duda. Las validaciones, tipos de campos, validar la integridad de la información, validar los campos obligatorios, eso se hace en la capa app service ?
Si, en general en la capa de AppService puedes colocar las validaciones para que antes de entrar a la capa de Repository, se compruebe que son datos válidos.
Mi pregunta es la siguiente es obligatorio utilizar repository en los nombres? o solo lo utilizas en los ejemplos, disculpa mi ignorancia por favor solo necesito verificar si es estado utilizando mal repository
Un par de preguntas. Tu logica de aplicación debe ir en la clase TicketAppService? es decir, supongamos que ademas de guardar el ticket actualizas otra tabla y haces validaciones sobre informacion de otras tablas (como parte del proceso), eso se haria en esa clase? y tu clase TicketsController solo expone los metodos de TicketAppService?
Si, estás en lo correcto. En el AppService se colocan las validaciones importantes para las entidades y luego en el Controller se exponen los métodos del AppService.
Si te refieres a lo del "IRepository where TEntity : class", el where es una palabra clave para definir el tipo de parametro "TEntity" lo que significa que los métodos de IRepository deben poder instanciar y manipular objetos del tipo TEntity
Código completo del Repository Design Pattern para C# y .NET:
// Interfaz del repositorio
public interface IRepository where TEntity : class
{
Task GetAllAsync();
Task GetByIdAsync(TId id);
Task AddAsync(TEntity entity);
Task UpdateAsync(TEntity entity);
Task DeleteAsync(TId id);
}
// Implementación del repositorio
public class Repository : IRepository where TEntity : class
{
protected readonly DatabaseContext _context;
public Repository(DatabaseContext context)
{
_context = context ?? throw new ArgumentNullException(nameof(context));
}
public virtual async Task GetAllAsync()
{
try
{
return await _context.Set().ToListAsync();
}
catch (Exception ex)
{
throw new Exception($"Couldn't retrieve entities: {ex.Message}");
}
}
public virtual async Task GetByIdAsync(TId id)
{
try
{
return await _context.FindAsync(id);
}
catch (Exception ex)
{
throw new Exception($"Couldn't retrieve the entity with id {id}: {ex.Message}");
}
}
public virtual async Task AddAsync(TEntity entity)
{
if (entity == null)
{
throw new ArgumentNullException(nameof(entity), "Entity must not be null");
}
try
{
await _context.AddAsync(entity);
await _context.SaveChangesAsync();
return entity;
}
catch (DbUpdateException ex)
{
throw new Exception($"Error saving entity: {ex.InnerException?.Message ?? ex.Message}");
}
}
public virtual async Task UpdateAsync(TEntity entity)
{
if (entity == null)
{
throw new ArgumentNullException(nameof(entity), "Entity must not be null");
}
try
{
_context.Update(entity);
await _context.SaveChangesAsync();
return entity;
}
catch (DbUpdateException ex)
{
throw new Exception($"Error updating entity: {ex.InnerException?.Message ?? ex.Message}");
}
}
public virtual async Task DeleteAsync(TId id)
{
var entity = await GetByIdAsync(id);
if (entity != null)
{
_context.Remove(entity);
await _context.SaveChangesAsync();
}
}
}
Acabo de entender en 15 minutos con 27 lo que con un profesor no pude en todo un semestre jj.Muchísimas gracias Ingeniela,te apoyo desde Cuba.
Me encantó tu explicación. Sin duda se nota to dedicación y trabajo
Muy buena explicación.
Muchas gracias 🤗⭐
Hola , antes que nada muchísimas gracias por la explicación es super buena , queda muy claro de manera rápida y sencilla , mi pregunta es si este patrón de diseño es como si tuvieramos una arquitectura en 3 capas pero utilizando los principios SOLID ?
Sip, ya que el patrón de diseño de repositorio tiene una capa de aplicación y otra de datos, es similar a una arquitectura en tres capas que utiliza los principios SOLID.
Muy buen tutorial, podrias mostrar la interfaz que implementa la clase TicketAppServices ?
// Interfaz del repositorio
public interface IRepository where TEntity : class
{
Task GetAllAsync();
Task GetByIdAsync(TId id);
Task AddAsync(TEntity entity);
Task UpdateAsync(TEntity entity);
Task DeleteAsync(TId id);
}
Buen video, gracias!
Excelente video..
Gracias! ahora lo tengo mas claro 💟
Muchísimas gracias!
Muy buen Video.
A la orden
Super, que buen video, me queda una duda. Las validaciones, tipos de campos, validar la integridad de la información, validar los campos obligatorios, eso se hace en la capa app service ?
Si, en general en la capa de AppService puedes colocar las validaciones para que antes de entrar a la capa de Repository, se compruebe que son datos válidos.
muy buen videa, se te agradece por compartir tus conocimientos, tengo una dura, MVC es un patron de diseño o un patron de arquitectura?
Se puede decir que es ambos
Que duro!
Mi pregunta es la siguiente es obligatorio utilizar repository en los nombres? o solo lo utilizas en los ejemplos, disculpa mi ignorancia por favor solo necesito verificar si es estado utilizando mal repository
Nop, no es obligatorio
Un par de preguntas. Tu logica de aplicación debe ir en la clase TicketAppService? es decir, supongamos que ademas de guardar el ticket actualizas otra tabla y haces validaciones sobre informacion de otras tablas (como parte del proceso), eso se haria en esa clase? y tu clase TicketsController solo expone los metodos de TicketAppService?
Si, estás en lo correcto. En el AppService se colocan las validaciones importantes para las entidades y luego en el Controller se exponen los métodos del AppService.
El proyecto como tal, no lo tienes en un repositorio para analizar?
Pronto lo subiré a mi repositorio de GitHub, gracias por la idea ⭐
Disculpa-...que significa la palabra Where en la zona donde se encuentra la interfaz???
Si te refieres a lo del "IRepository where TEntity : class", el where es una palabra clave para definir el tipo de parametro "TEntity" lo que significa que los métodos de IRepository deben poder instanciar y manipular objetos del tipo TEntity
hola, dónde puedo encontrar el proyecto completo, si es posible?
Estaré subiendolo pronto a mi repositorio de GitHub: github.com/ingeniela/DetectaLaLogica
Y donde estan los procedimientos almacenados ? ... necesito registrar data en mas de una tabla a la vez