Scrutor para C# (.NET): guía completa con ejemplos prácticos
Scrutor es una biblioteca de código abierto para la plataforma .NET que amplía el mecanismo integrado de inyección de dependencias (Dependency Injection, DI) con capacidades de escaneo automático de ensamblados (assembly scanning). Permite registrar servicios en el contenedor DI basándose en convenciones de nomenclatura, atributos o interfaces, lo que simplifica enormemente la configuración del contenedor IoC en proyectos grandes.
¿Para qué sirve esta biblioteca? En el contenedor estándar Microsoft.Extensions.DependencyInjection, cada servicio debe registrarse manualmente: services.AddScoped<IMyService, MyService>(). En un proyecto con decenas o cientos de servicios, esto infla el código en Startup.cs o Program.cs, reduce la legibilidad y aumenta el riesgo de errores. Scrutor resuelve este problema permitiendo registrar todos los servicios de un ensamblado con una sola línea: services.Scan(scan => scan.FromAssemblyOf<IMyService>()...).
Scrutor es especialmente útil en arquitecturas como Domain-Driven Design (DDD), Clean Architecture o monolitos modulares. Encuentra automáticamente todas las implementaciones de interfaces, clases con atributos específicos (por ejemplo, [ServiceDescriptor]) o clases que siguen ciertos patrones de nomenclatura (como todas las clases que terminan en "Repository"). Esto hace que el código sea más limpio y que añadir nuevos servicios sea una tarea trivial que no requiere modificar la configuración del DI.
Instalación
Scrutor se instala a través del Administrador de paquetes NuGet. Ejecuta uno de los siguientes comandos:
# Mediante .NET CLI
dotnet add package Scrutor
# Mediante Package Manager Console (Visual Studio)
Install-Package Scrutor
Después de la instalación, se agregará al proyecto una referencia a la biblioteca Scrutor. Asegúrate de tener instalado el SDK de .NET versión 6.0 o superior (se recomienda .NET 8.0+).
Inicio rápido
Veamos un ejemplo mínimo funcional. Crearemos una aplicación de consola con tres archivos: la interfaz IGreetingService, su implementación GreetingService y el punto de entrada Program.cs.
// IGreetingService.cs
public interface IGreetingService
{
string Greet(string name);
}
// GreetingService.cs
public class GreetingService : IGreetingService
{
public string Greet(string name) => $"¡Hola, {name}!";
}
// Program.cs
using Microsoft.Extensions.DependencyInjection;
using Scrutor;
var services = new ServiceCollection();
// Registro manual (enfoque tradicional)
// services.AddTransient<IGreetingService, GreetingService>();
// Registro con Scrutor (escaneo de ensamblados)
services.Scan(scan => scan
.FromAssemblyOf<IGreetingService>() // Escanea el ensamblado que contiene IGreetingService
.AddClasses(classes => classes.AssignableTo<IGreetingService>()) // Busca clases que implementen IGreetingService
.AsImplementedInterfaces() // Las registra como implementación de la interfaz
.WithTransientLifetime()); // Establece la duración Transient
var serviceProvider = services.BuildServiceProvider();
var greetingService = serviceProvider.GetRequiredService<IGreetingService>();
Console.WriteLine(greetingService.Greet("Mundo"));
// Salida: ¡Hola, Mundo!
En este ejemplo, Scrutor encuentra automáticamente la clase GreetingService en el mismo ensamblado que la interfaz IGreetingService y la registra como Transient. Si agregas una nueva implementación de IGreetingService, se registrará automáticamente sin necesidad de modificar el código de Program.cs.
Métodos y clases principales
Scrutor proporciona una API fluida (fluent API) para construir cadenas de llamadas. A continuación, se presentan 8 métodos/clases clave con sus firmas, descripciones y ejemplos.
1. Scan(IServiceCollection, Action<ITypeSourceSelector>)
También en la biblioteca
Autorización y autenticación en TypeScript: guía completa
Doctrine DBAL PHP: guía completa con ejemplos prácticos
Accompanist para Kotlin: guía completa con ejemplos prácticos
Generación de PDF en Swift (iOS/macOS): resumen de herramientas y ejemplos