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
También en la biblioteca
Criterion para Rust: guía completa con ejemplos prácticos
Bibliotecas WebSocket de Rust: Tokio-tungstenite y async-tungstenite para tiempo real
Trabajo con CSV en C++: biblioteca libcsv y herramientas estándar
Bucket4j Java: guía completa con ejemplos prácticos
Migraciones de bases de datos en Node.js: Resumen de herramientas y ejemplos