Ich bin kein Experte, aber ich glaube, ich kann helfen. Und ja, es ist eine bestimmte Art von Abhängigkeitsinjektion.
Haftungsausschluss: Fast alles wurde aus dem Ninject Wiki "gestohlen"
Lassen Sie uns die Idee der Abhängigkeitsinjektion anhand eines einfachen Beispiels untersuchen. Angenommen, Sie schreiben das nächste Blockbuster-Spiel, in dem edle Krieger um großen Ruhm kämpfen. Zuerst brauchen wir eine Waffe, mit der wir unsere Krieger bewaffnen können.
class Sword
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Dann wollen wir eine Klasse schaffen, die unsere Krieger selbst repräsentiert. Um seine Feinde anzugreifen, benötigt der Krieger eine Attack () -Methode. Wenn diese Methode aufgerufen wird, sollte es sein Schwert verwenden, um seinen Gegner zu schlagen.
class Samurai
{
readonly Sword sword;
public Samurai()
{
this.sword = new Sword();
}
public void Attack(string target)
{
this.sword.Hit(target);
}
}
Jetzt können wir unseren Samurai erschaffen und kämpfen!
class Program
{
public static void Main()
{
var warrior = new Samurai();
warrior.Attack("the evildoers");
}
}
Wie Sie sich vorstellen können, druckt dies Chopped the Evildoers sauber zur Hälfte auf die Konsole. Das funktioniert gut, aber was ist, wenn wir unseren Samurai mit einer anderen Waffe ausrüsten wollen? Da das Schwert im Konstruktor der Samurai-Klasse erstellt wird, müssen wir die Implementierung der Klasse ändern, um diese Änderung vorzunehmen.
Wenn eine Klasse von einer konkreten Abhängigkeit abhängig ist, heißt es engen Kopplung mit dieser Klasse . In diesem Beispiel ist die Samurai-Klasse eng mit der Schwert-Klasse verbunden. Wenn Klassen eng miteinander verbunden sind, können sie nicht ausgetauscht werden, ohne ihre Implementierung zu ändern. Um eine enge Kopplung der Klassen zu vermeiden, können wir Interfaces verwenden, um eine Indirektionsebene bereitzustellen. Lassen Sie uns eine Benutzeroberfläche erstellen, die eine Waffe in unserem Spiel darstellt.
interface IWeapon
{
void Hit(string target);
}
Dann kann unsere Sword-Klasse diese Schnittstelle implementieren:
class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Und wir können unsere Samurai-Klasse ändern:
class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Jetzt können unsere Samurai mit verschiedenen Waffen bewaffnet werden. Aber warte! Das Schwert wird immer noch im Samurai-Konstruktor hergestellt. Da wir die Implementierung von Samurai noch ändern müssen, um unserem Krieger eine weitere Waffe zu geben, ist Samurai immer noch eng mit Sword verbunden.
Zum Glück gibt es eine einfache Lösung. Anstatt das Schwert im Konstruktor von Samurai zu erstellen, können wir es stattdessen als Parameter des Konstruktors anzeigen. Wird auch als Konstruktorinjektion bezeichnet.
class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Wie Giorgio betonte, gibt es auch Immobilieninjektionen. Das wäre so etwas wie:
class Samurai
{
IWeapon weapon;
public Samurai() { }
public void SetWeapon(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Hoffe das hilft.