Scrutor für C# (.NET): Vollständige Anleitung mit Beispielen
Scrutor ist eine Open-Source-Bibliothek für die .NET-Plattform, die den integrierten Mechanismus zur Abhängigkeitsinjektion (Dependency Injection, DI) um die automatische Suche in Assemblies (Assembly Scanning) erweitert. Sie ermöglicht die Registrierung von Diensten im DI-Container basierend auf Namenskonventionen, Attributen oder Schnittstellen, was die Konfiguration des IoC-Containers in großen Projekten erheblich vereinfacht.
Warum wird diese Bibliothek benötigt? Im Standard-Container Microsoft.Extensions.DependencyInjection muss jeder Dienst manuell registriert werden: services.AddScoped<IMyService, MyService>(). In einem Projekt mit Dutzenden oder Hunderten von Diensten führt dies zu aufgeblähtem Code in Startup.cs oder Program.cs, verringert die Lesbarkeit und erhöht das Risiko von Fehlern. Scrutor löst dieses Problem, indem es die Registrierung aller Dienste aus einer Assembly mit einer einzigen Zeile ermöglicht: services.Scan(scan => scan.FromAssemblyOf<IMyService>()...).
Scrutor ist besonders nützlich in Architekturen, die Domain-Driven Design (DDD), Clean Architecture oder modulare Monolithen verwenden. Es findet automatisch alle Implementierungen von Schnittstellen, Klassen mit bestimmten Attributen (z. B. [ServiceDescriptor]) oder Klassen, die bestimmten Namensmustern entsprechen (z. B. alle Klassen, die auf "Repository" enden). Dies macht den Code sauberer und das Hinzufügen neuer Dienste zu einer trivialen Aufgabe, die keine Änderung der DI-Konfiguration erfordert.
Installation
Scrutor wird über den NuGet Package Manager installiert. Führen Sie einen der folgenden Befehle aus:
# Über die .NET CLI
dotnet add package Scrutor
# Über die Package Manager Console (Visual Studio)
Install-Package Scrutor
Nach der Installation wird dem Projekt ein Verweis auf die Bibliothek Scrutor hinzugefügt. Stellen Sie sicher, dass Sie das .NET SDK Version 6.0 oder höher installiert haben (empfohlen wird .NET 8.0+).
Schnellstart
Betrachten wir ein minimales funktionierendes Beispiel. Wir erstellen eine Konsolenanwendung mit drei Dateien: dem Interface IGreetingService, seiner Implementierung GreetingService und dem Einstiegspunkt Program.cs.
// IGreetingService.cs
public interface IGreetingService
{
string Greet(string name);
}
// GreetingService.cs
public class GreetingService : IGreetingService
{
public string Greet(string name) => $"Hallo, {name}!";
}
// Program.cs
using Microsoft.Extensions.DependencyInjection;
using Scrutor;
var services = new ServiceCollection();
// Manuelle Registrierung (herkömmlicher Ansatz)
// services.AddTransient<IGreetingService, GreetingService>();
// Registrierung mit Scrutor (Assembly-Scanning)
services.Scan(scan => scan
.FromAssemblyOf<IGreetingService>() // Scannt die Assembly, die IGreetingService enthält
.AddClasses(classes => classes.AssignableTo<IGreetingService>()) // Sucht Klassen, die IGreetingService implementieren
.AsImplementedInterfaces() // Registriert als Implementierung des Interfaces
.WithTransientLifetime()); // Setzt die Lebensdauer auf Transient
var serviceProvider = services.BuildServiceProvider();
var greetingService = serviceProvider.GetRequiredService<IGreetingService>();
Console.WriteLine(greetingService.Greet("Welt"));
// Ausgabe: Hallo, Welt!
In diesem Beispiel findet Scrutor automatisch die Klasse GreetingService in derselben Assembly wie das Interface IGreetingService und registriert sie als Transient. Wenn Sie eine neue Implementierung von IGreetingService hinzufügen, wird diese automatisch registriert, ohne dass der Code in Program.cs geändert werden muss.
Wichtige Methoden und Klassen
Scrutor bietet eine fließende API (Fluent API) zum Aufbau von Aufrufketten. Betrachten wir 8 wichtige Methoden/Klassen mit Signaturen, Beschreibungen und Beispielen.
1. Scan(IServiceCollection, Action<ITypeSourceSelector>)
Auch in der Bibliothek
gRPC für C++: Bibliotheken, Einrichtung und Codebeispiele
once_cell für Rust: vollständige Anleitung mit Beispielen
Redis-Client für PHP: Predis — Installation, Verbindung, Beispiele