Aller au contenu

interface IRepository<T>

Contexte : Le pattern Repository est très courant pour l’accès aux données. Une interface générique IRepository<T> définit les opérations CRUD (Create, Read, Update, Delete) sans dépendre d’un type d’entité spécifique. Les implémentations concrètes fournissent le code pour une source de données particulière (base de données, API, fichier).

using System;
using System.Collections.Generic;
using System.Linq;
public interface IRepository<T>
{
T GetById(int id);
IEnumerable<T> GetAll();
void Add(T entity);
void Update(T entity);
void Delete(int id);
}
// Implémentation en mémoire (pour tests)
public class InMemoryRepository<T> : IRepository<T> where T : class, IEntity
{
private readonly List<T> _items = new List<T>();
private int _nextId = 1;
public T GetById(int id) => _items.FirstOrDefault(x => x.Id == id);
public IEnumerable<T> GetAll() => _items.ToList();
public void Add(T entity)
{
entity.Id = _nextId++;
_items.Add(entity);
}
public void Update(T entity)
{
var existing = GetById(entity.Id);
if (existing != null)
{
_items.Remove(existing);
_items.Add(entity);
}
}
public void Delete(int id)
{
var item = GetById(id);
if (item != null) _items.Remove(item);
}
}
public interface IEntity
{
int Id { get; set; }
}
public class User : IEntity
{
public int Id { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main()
{
IRepository<User> userRepo = new InMemoryRepository<User>();
userRepo.Add(new User { Name = "Alice" });
userRepo.Add(new User { Name = "Bob" });
foreach (var user in userRepo.GetAll())
{
Console.WriteLine($"{user.Id}: {user.Name}");
}
}
}
Fenêtre de terminal
dotnet run
1: Alice
2: Bob
  • IRepository<T> est indépendant du mécanisme de persistance.
  • Le pattern facilite les tests unitaires (moquage).

Entity Framework CoreDbSet<T> agit comme un repository pour chaque entité.
Voir documentation sur le pattern Repository.