Ardalis.Specification für C# (.NET): Vollständige Anleitung mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Ardalis.Specification für C# (.NET): Vollständige Anleitung mit Beispielen

In der modernen C# (.NET)-Entwicklung ist die Organisation von sauberem, testbarem und wartbarem Code für die Datenverarbeitung eine der wichtigsten Aufgaben. Das Specification Pattern ist ein mächtiges Werkzeug, das Geschäftslogik und Abfrageregeln in wiederverwendbare, kombinierbare und testbare Klassen kapselt. Die Bibliothek Ardalis.Specification ist der De-facto-Standard für die Implementierung dieses Patterns im .NET-Ökosystem. Sie bietet Entwicklern eine elegante Möglichkeit, sich von konkreten ORMs (Entity Framework Core, Dapper usw.) zu abstrahieren und flexible Datenabfragen zu erstellen.

Warum ist das notwendig? In einer typischen Anwendung mit Entity Framework Core ist die Abfragelogik oft über den gesamten Code verteilt: in Controllern, Services und Repositories. Das führt zu Code-Duplizierung (z. B. wird derselbe Filter „aktive Benutzer“ an verschiedenen Stellen wiederholt), erschwert das Testen (weil der DbContext gemockt werden muss) und macht den Code anfällig (eine Änderung an einer Abfrage kann eine andere beschädigen). Ardalis.Specification löst diese Probleme, indem es eine einheitliche, streng typisierte Methode zur Beschreibung der benötigten Daten bietet, ohne an die konkrete Implementierung der Datenabfrage gebunden zu sein.

Die Bibliothek bietet eine umfangreiche API zum Erstellen von Abfragen: von einfachen Filtern (Where) über komplexe Includes (Include, ThenInclude), Sortierungen (OrderBy, ThenBy), Paginierung (Skip, Take) bis hin zu Projektionen (Select). Sie ist vollständig kompatibel mit Entity Framework Core (über das Paket Ardalis.Specification.EntityFrameworkCore), kann aber auch an andere Datenanbieter angepasst werden. Dadurch wird Ihr Code sauberer, die Abfragelogik wiederverwendbar und das Testen deutlich einfacher.

Installation

Die Bibliothek wird über NuGet installiert. Abhängig von Ihrem ORM müssen Sie das Hauptpaket und das entsprechende Provider-Paket installieren.

# Hauptpaket (enthält Basisklassen und Schnittstellen)
dotnet add package Ardalis.Specification

# Paket für Entity Framework Core (enthält die Repository-Implementierung)
dotnet add package Ardalis.Specification.EntityFrameworkCore

# Wenn Sie nur das Basis-Paket ohne EF Core verwenden (z. B. für Tests oder eine benutzerdefinierte Implementierung)
dotnet add package Ardalis.Specification

Schnellstart

Sehen wir uns ein minimales Arbeitsbeispiel an. Angenommen, wir haben eine Entität Product und möchten alle Produkte mit einem Preis über 100 abrufen.

// 1. Entität definieren
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. Spezifikation erstellen
public class ProductsWithPriceGreaterThanSpec : Specification<Product>
{
    public ProductsWithPriceGreaterThanSpec(decimal minPrice)
    {
        Query.Where(p => p.Price > minPrice);
    }
}

// 3. Spezifikation mit dem Repository verwenden
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);
    }
}

In diesem Beispiel haben wir eine Spezifikationsklasse erstellt, die die Filterlogik kapselt. Das Repository IRepositoryBase (aus dem Paket Ardalis.Specification.EntityFrameworkCore) wendet diese Spezifikation automatisch auf Ihren DbContext an und gibt das Ergebnis zurück. Das ist die Essenz des Patterns: die Trennung der Abfragebeschreibung von ihrer Ausführung.

Wichtige Methoden und Klassen

Die Bibliothek bietet eine leistungsstarke API zum Erstellen von Abfragen. Betrachten wir die wichtigsten Methoden und ihre Verwendung.

Empfehlungen