Je ne suis pas un expert, mais je pense pouvoir aider. Et oui, il s’agit d’un type spécifique d’injection de dépendance.
Disclaimer: Presque tout cela a été "volé" du Wiki Ninject
Examinons l'idée d'injection de dépendance en passant à travers un exemple simple. Disons que vous écrivez le prochain jeu à succès, où de nobles guerriers se battent pour la plus grande gloire. Premièrement, nous aurons besoin d’une arme appropriée pour armer nos guerriers.
class Sword
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Ensuite, créons une classe pour représenter nos guerriers eux-mêmes. Afin d'attaquer ses ennemis, le guerrier aura besoin d'une méthode Attack (). Lorsque cette méthode est appelée, il doit utiliser son épée pour frapper son adversaire.
class Samurai
{
readonly Sword sword;
public Samurai()
{
this.sword = new Sword();
}
public void Attack(string target)
{
this.sword.Hit(target);
}
}
Maintenant, nous pouvons créer nos samouraïs et combattre!
class Program
{
public static void Main()
{
var warrior = new Samurai();
warrior.Attack("the evildoers");
}
}
Comme vous pouvez l'imaginer, cela imprimera Chopped les malfaiteurs propres en deux sur la console. Cela fonctionne très bien, mais si nous voulions armer notre Samouraï avec une autre arme? Puisque l’épée est créée dans le constructeur de la classe Samurai, nous devons modifier l’implémentation de la classe pour pouvoir effectuer ce changement.
Lorsqu'une classe dépend d'une dépendance concrète, on dit qu'elle est étroitement liée à cette classe . Dans cet exemple, la classe Samurai est étroitement associée à la classe Sword. Lorsque les classes sont étroitement associées, elles ne peuvent pas être échangées sans modifier leur implémentation. Afin d'éviter un couplage étroit des classes, nous pouvons utiliser des interfaces pour fournir un niveau d'indirection. Créons une interface pour représenter une arme dans notre jeu.
interface IWeapon
{
void Hit(string target);
}
Ensuite, notre classe Sword peut implémenter cette interface:
class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Et nous pouvons modifier notre classe de samouraï:
class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Maintenant, nos samouraïs peuvent être armés de différentes armes. Mais attendez! L'épée est toujours créée à l'intérieur du constructeur de Samurai. Comme nous devons encore modifier la mise en œuvre de Samurai afin de donner une autre arme à notre guerrier, Samurai est toujours étroitement lié à Sword.
Heureusement, il existe une solution facile. Plutôt que de créer l'épée à partir du constructeur de Samurai, nous pouvons l'exposer en tant que paramètre du constructeur. Également connu sous le nom d'injection de constructeur.
class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Comme l'a souligné Giorgio, il existe également une injection de propriété. Ce serait quelque chose comme:
class Samurai
{
IWeapon weapon;
public Samurai() { }
public void SetWeapon(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
J'espère que cela t'aides.