Ardalis.Specification para C# (.NET): guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Ardalis.Specification para C# (.NET): guía completa con ejemplos

En el desarrollo moderno con C# (.NET), uno de los desafíos clave es organizar un código limpio, testeable y mantenible para trabajar con datos. El patrón Specification (Especificación) es una herramienta poderosa que permite encapsular reglas de negocio y lógica de consultas en clases reutilizables, componibles y testeables. La librería Ardalis.Specification es el estándar de facto para implementar este patrón en el ecosistema .NET, ofreciendo a los desarrolladores una forma elegante de abstraerse de ORMs específicos (Entity Framework Core, Dapper, etc.) y construir consultas de datos flexibles.

¿Por qué es necesario? En una aplicación típica que usa Entity Framework Core, la lógica de consultas suele estar dispersa por todo el código: en controladores, servicios, repositorios. Esto provoca duplicación de código (por ejemplo, el mismo filtro "usuarios activos" puede repetirse en varios lugares), dificulta las pruebas (hay que simular DbContext) y genera fragilidad (cambiar una consulta puede romper otra). Ardalis.Specification resuelve estos problemas ofreciendo una forma única y fuertemente tipada de describir qué datos se necesitan, sin acoplarse a cómo se obtendrán.

La librería proporciona una API completa para construir consultas: desde filtros simples (Where) hasta inclusiones complejas de datos relacionados (Include, ThenInclude), ordenamientos (OrderBy, ThenBy), paginación (Skip, Take) y proyecciones (Select). Es totalmente compatible con Entity Framework Core (a través del paquete Ardalis.Specification.EntityFrameworkCore), pero también puede adaptarse a otros proveedores de datos. Gracias a esto, tu código será más limpio, la lógica de consultas será reutilizable y las pruebas serán mucho más sencillas.

Instalación

Para instalar la librería se usa NuGet. Dependiendo de tu ORM, debes instalar el paquete base y el paquete proveedor.

# Paquete base (contiene clases e interfaces fundamentales)
dotnet add package Ardalis.Specification

# Paquete para Entity Framework Core (contiene la implementación del repositorio)
dotnet add package Ardalis.Specification.EntityFrameworkCore

# Si solo usas el paquete base sin EF Core (por ejemplo, para pruebas o implementación personalizada)
dotnet add package Ardalis.Specification

Inicio rápido

Veamos un ejemplo mínimo funcional. Supongamos que tenemos una entidad Product y queremos obtener todos los productos cuyo precio sea mayor a 100.

// 1. Definimos la entidad
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. Creamos la especificación
public class ProductsWithPriceGreaterThanSpec : Specification<Product>
{
    public ProductsWithPriceGreaterThanSpec(decimal minPrice)
    {
        Query.Where(p => p.Price > minPrice);
    }
}

// 3. Usamos la especificación con el repositorio
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);
    }
}

En este ejemplo, creamos una clase de especificación que encapsula la lógica de filtrado. El repositorio IRepositoryBase (del paquete Ardalis.Specification.EntityFrameworkCore) aplica automáticamente esta especificación a tu DbContext y devuelve el resultado. Esta es la esencia del patrón: separar la descripción de la consulta de su ejecución.

Métodos y clases principales

La librería ofrece una API potente para construir consultas. Veamos los

Recommendations