Scrutor C# (.NET) : guide complet avec exemples
Scrutor est une bibliothèque open source pour la plateforme .NET qui étend le mécanisme d'injection de dépendances (Dependency Injection, DI) intégré avec des fonctionnalités de scan automatique d'assemblies (assembly scanning). Elle permet d'enregistrer des services dans le conteneur DI en se basant sur des conventions de nommage, des attributs ou des interfaces, simplifiant considérablement la configuration du conteneur IoC dans les grands projets.
Pourquoi utiliser cette bibliothèque ? Dans le conteneur standard Microsoft.Extensions.DependencyInjection, chaque service doit être enregistré manuellement : services.AddScoped<IMyService, MyService>(). Dans un projet contenant des dizaines ou des centaines de services, cela entraîne un gonflement du code dans Startup.cs ou Program.cs, réduit la lisibilité et augmente le risque d'erreurs. Scrutor résout ce problème en permettant d'enregistrer tous les services d'un assembly en une seule ligne : services.Scan(scan => scan.FromAssemblyOf<IMyService>()...).
Scrutor est particulièrement utile dans les architectures utilisant le Domain-Driven Design (DDD), la Clean Architecture ou les monolithes modulaires. Il trouve automatiquement toutes les implémentations d'interfaces, les classes avec des attributs spécifiques (par exemple, [ServiceDescriptor]) ou les classes correspondant à certains modèles de nommage (par exemple, toutes les classes se terminant par "Repository"). Cela rend le code plus propre et l'ajout de nouveaux services devient une tâche triviale sans nécessiter de modification de la configuration DI.
Installation
Scrutor s'installe via le gestionnaire de paquets NuGet. Exécutez l'une des commandes suivantes :
# Via .NET CLI
dotnet add package Scrutor
# Via Package Manager Console (Visual Studio)
Install-Package Scrutor
Après l'installation, une référence à la bibliothèque Scrutor sera ajoutée à votre projet. Assurez-vous d'avoir installé le SDK .NET version 6.0 ou supérieure (.NET 8.0+ recommandé).
Démarrage rapide
Examinons un exemple fonctionnel minimal. Créons une application console avec trois fichiers : l'interface IGreetingService, son implémentation GreetingService et le point d'entrée Program.cs.
// IGreetingService.cs
public interface IGreetingService
{
string Greet(string name);
}
// GreetingService.cs
public class GreetingService : IGreetingService
{
public string Greet(string name) => $"Bonjour, {name}!";
}
// Program.cs
using Microsoft.Extensions.DependencyInjection;
using Scrutor;
var services = new ServiceCollection();
// Enregistrement manuel (approche classique)
// services.AddTransient<IGreetingService, GreetingService>();
// Enregistrement via Scrutor (scan d'assembly)
services.Scan(scan => scan
.FromAssemblyOf<IGreetingService>() // Scanne l'assembly contenant IGreetingService
.AddClasses(classes => classes.AssignableTo<IGreetingService>()) // Cherche les classes implémentant IGreetingService
.AsImplementedInterfaces() // Enregistre comme implémentation d'interface
.WithTransientLifetime()); // Définit la durée de vie Transient
var serviceProvider = services.BuildServiceProvider();
var greetingService = serviceProvider.GetRequiredService<IGreetingService>();
Console.WriteLine(greetingService.Greet("Monde"));
// Sortie : Bonjour, Monde!
Dans cet exemple, Scrutor trouve automatiquement la classe GreetingService dans le même assembly que l'interface IGreetingService et l'enregistre en tant que Transient. Si vous ajoutez une nouvelle implémentation de IGreetingService, elle sera enregistrée automatiquement sans modifier le code de Program.cs.
Méthodes et classes principales
Scrutor fournit une API fluide pour construire des chaînes d'appels. Voici 8 méthodes/classes clés avec leurs signatures, descriptions et exemples.
1. Scan(IServiceCollection, Action<ITypeSourceSelector>)
Aussi dans la bibliothèque
SQLite pour C++ : guide complet avec exemples
Travailler avec XML en Kotlin : bibliothèques, analyse et création de documents
ORM pour TypeScript : comparaison de TypeORM, Prisma et MikroORM