Dependency Injection ist ein schrecklicher Name (IMO) 1 für ein recht einfaches Konzept. Hier ist ein Beispiel:
- Sie haben eine Methode (oder Klasse mit Methoden), die X ausführt (z. B. Daten aus der Datenbank abrufen).
- Im Rahmen von X erstellt und verwaltet diese Methode eine interne Ressource (z
DbContext
. B. a ). Diese interne Ressource wird als Abhängigkeit bezeichnet
- Sie entfernen das Erstellen und Verwalten der Ressource (dh
DbContext
) aus der Methode und machen es zur Verantwortung des Aufrufers, diese Ressource bereitzustellen (als Methodenparameter oder nach Instanziierung der Klasse).
- Sie führen jetzt die Abhängigkeitsinjektion durch.
[1] : Ich komme aus einer niedrigeren Ebene und habe Monate gebraucht, um mich hinzusetzen und die Abhängigkeitsinjektion zu lernen, da der Name impliziert, dass es viel komplizierter wäre, wie DLL-Injektion . Die Tatsache, dass Visual Studio (und wir Entwickler im Allgemeinen) auf die .NET-Bibliotheken (DLLs oder Assemblys ) verweist, von denen ein Projekt als Abhängigkeiten abhängt, hilft überhaupt nicht. Es gibt sogar so etwas wie den Dependency Walker (abhängige.exe) .
[Bearbeiten] Ich dachte, ein Demo-Code würde für einige nützlich sein, also hier ist einer (in C #).
Ohne Abhängigkeitsinjektion:
public class Repository : IDisposable
{
protected DbContext Context { get; }
public Repository()
{
Context = new DbContext("name=MyEntities");
}
public void Dispose()
{
Context.Dispose();
}
}
Ihr Verbraucher würde dann so etwas tun:
using ( var repository = new Repository() )
{
// work
}
Dieselbe Klasse, die mit einem Abhängigkeitsinjektionsmuster implementiert wurde, würde folgendermaßen aussehen:
public class RepositoryWithDI
{
protected DbContext Context { get; }
public RepositoryWithDI(DbContext context)
{
Context = context;
}
}
Es liegt nun in der Verantwortung des Anrufers, a zu instanziieren DbContext
und an Ihre Klasse weiterzuleiten (errm, injizieren ):
using ( var context = new DbContext("name=MyEntities") )
{
var repository = new RepositoryWithDI(context);
// work
}