Das Management des Lebenszyklus von Abhängigkeiten beinhaltet die Organisation der Erstellung, Initialisierung, Aktualisierung und Zerstörung von Anwendungskomponenten auf eine Weise, die sie voneinander unabhängig und leicht testbar macht. Dazu werden häufig IoC-Container (Inversion of Control) und das Pattern Dependency Injection (DI) verwendet.
IoC-Container ermöglicht:
Beispiel in C# mit Microsoft.Extensions.DependencyInjection:
public interface IMessageSender { void Send(string msg); } public class EmailSender : IMessageSender { public void Send(string msg) { /* Versand von Email */ } } // Registrierung von Abhängigkeiten var services = new ServiceCollection(); services.AddScoped<IMessageSender, EmailSender>(); // Erhalt einer Instanz var provider = services.BuildServiceProvider(); var sender = provider.GetService<IMessageSender>(); sender.Send("Hallo!");
Wichtige Merkmale:
Was ist der Unterschied zwischen Dependency Injection (DI) und dem Service Locator Pattern, und warum gilt der Service Locator als Antipattern?
Der Service Locator verletzt die explizite Übergabe von Abhängigkeiten und macht den Code weniger transparent. Es ist besser, DI über Konstruktoren oder Methoden zu verwenden, damit der Compiler die Korrektheit der Abhängigkeiten kontrolliert.
// Schlecht: Service Locator var sender = ServiceLocator.Get<IMessageSender>(); // Gut: über DI public class MyService { public MyService(IMessageSender sender) { ... } }
Was ist der Unterschied zwischen dem Singleton Pattern und der Single Instance Lebensdauer in einem DI-Container?
Das Singleton Pattern wird manuell implementiert und ist nicht vom Container abhängig; Single Instance liefert die Instanz aus dem Container, was sicherer für Unit-Tests und Erweiterungen ist.
Sollten Abhängigkeiten in allen Klassen, auch in einfachen Hilfsklassen, implementiert werden?
Nein. Hilfsprogramme ohne Abhängigkeiten oder schwach gekoppelte Hilfsklassen (z.B. Klasse für mathematische Konstanten) sollten nicht mit DI implementiert werden — das kompliziert den Code ohne Nutzen.