Ardalis.Specification pour C# (.NET) : guide complet avec exemples

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Ardalis.Specification pour C# (.NET) : guide complet avec exemples

Dans le développement moderne en C# (.NET), l'un des défis majeurs est d'organiser un code propre, testable et maintenable pour la gestion des données. Le patron de conception Specification est un outil puissant qui permet d'encapsuler les règles métier et la logique des requêtes dans des classes réutilisables, composables et testables. La bibliothèque Ardalis.Specification est devenue la référence pour implémenter ce patron dans l'écosystème .NET, offrant aux développeurs une manière élégante de s'abstraire des ORM spécifiques (Entity Framework Core, Dapper, etc.) et de construire des requêtes flexibles.

Pourquoi est-ce utile ? Dans une application classique utilisant Entity Framework Core, la logique des requêtes est souvent dispersée dans les contrôleurs, les services et les repositories. Cela entraîne des duplications de code (par exemple, le même filtre "utilisateurs actifs" peut apparaître à plusieurs endroits), des difficultés de test (nécessité de mocker le DbContext) et une fragilité (modifier une requête peut en casser une autre). Ardalis.Specification résout ces problèmes en proposant une manière unique et fortement typée de décrire les données à récupérer, sans se soucier de la manière dont elles seront obtenues.

La bibliothèque offre une API riche pour construire des requêtes : des filtres simples (Where) aux inclusions complexes de données liées (Include, ThenInclude), en passant par les tris (OrderBy, ThenBy), la pagination (Skip, Take) et les projections (Select). Elle est entièrement compatible avec Entity Framework Core (via le package Ardalis.Specification.EntityFrameworkCore), mais peut également être adaptée à d'autres fournisseurs de données. Grâce à cela, votre code devient plus propre, la logique des requêtes est réutilisable et les tests sont considérablement simplifiés.

Installation

Pour installer la bibliothèque, utilisez NuGet. Selon votre ORM, installez le package principal et le package fournisseur.

# Package principal (contient les classes de base et les interfaces)
dotnet add package Ardalis.Specification

# Package pour Entity Framework Core (contient l'implémentation du repository)
dotnet add package Ardalis.Specification.EntityFrameworkCore

# Si vous utilisez uniquement le package principal sans EF Core (par exemple pour les tests ou une implémentation personnalisée)
dotnet add package Ardalis.Specification

Démarrage rapide

Voici un exemple minimal fonctionnel. Supposons que nous ayons une entité Product et que nous souhaitions récupérer tous les produits dont le prix est supérieur à 100.

// 1. Définir l'entité
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = string.Empty;
    public decimal Price { get; set; }
    public bool IsActive { get; set; }
}

// 2. Créer la spécification
public class ProductsWithPriceGreaterThanSpec : Specification<Product>
{
    public ProductsWithPriceGreaterThanSpec(decimal minPrice)
    {
        Query.Where(p => p.Price > minPrice);
    }
}

// 3. Utiliser la spécification avec le repository
public class ProductService
{
    private readonly IRepositoryBase<Product> _repository;

    public ProductService(IRepositoryBase<Product> repository)
    {
        _repository = repository;
    }

    public async Task<List<Product>> GetExpensiveProductsAsync(decimal minPrice)
    {
        var spec = new ProductsWithPriceGreaterThanSpec(minPrice);
        return await _repository.ListAsync(spec);
    }
}

Dans cet exemple, nous avons créé une classe de spécification qui encapsule la logique de filtrage. Le repository IRepositoryBase (du package Ardalis.Specification.EntityFrameworkCore) applique automatiquement cette spécification à votre DbContext et retourne le résultat. C'est l'essence même du patron : séparer la description de la requête de son exécution.

Méthodes et classes principales

La bibliothèque offre une API puissante pour construire des requêtes. Examinons

Recommendations