Non sono esperto, ma penso di poterti aiutare. E sì, è un tipo specifico di Iniezione di Dipendenza.
Dichiarazione di non responsabilità: quasi tutto ciò è stato "rubato" da Ninject Wiki
Esaminiamo l'idea dell'iniezione di dipendenza seguendo un semplice esempio. Diciamo che stai scrivendo il prossimo gioco di successo, dove i nobili guerrieri combattono per la grande gloria. Per prima cosa, avremo bisogno di un'arma adatta per armare i nostri guerrieri.
class Sword
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Quindi, creiamo un corso per rappresentare i nostri guerrieri stessi. Per attaccare i suoi nemici, il guerriero avrà bisogno di un metodo di attacco (). Quando viene chiamato questo metodo, dovrebbe usare la sua Spada per colpire il suo avversario.
class Samurai
{
readonly Sword sword;
public Samurai()
{
this.sword = new Sword();
}
public void Attack(string target)
{
this.sword.Hit(target);
}
}
Ora possiamo creare il nostro samurai e combattere!
class Program
{
public static void Main()
{
var warrior = new Samurai();
warrior.Attack("the evildoers");
}
}
Come puoi immaginare, questo stamperà Taglia i malfattori puliti a metà alla console. Funziona bene, ma se volessimo armare il nostro samurai con un'altra arma? Poiché la Spada viene creata all'interno del costruttore della classe Samurai, dobbiamo modificare l'implementazione della classe per apportare questa modifica.
Quando una classe dipende da una dipendenza concreta, si dice che sia strettamente accoppiata a quella classe . In questo esempio, la classe Samurai è strettamente accoppiata alla classe Sword. Quando le classi sono strettamente accoppiate, non possono essere interscambiate senza alterare la loro implementazione. Per evitare classi di accoppiamento stretto, possiamo utilizzare le interfacce per fornire un livello di riferimento indiretto. Creiamo un'interfaccia per rappresentare un'arma nel nostro gioco.
interface IWeapon
{
void Hit(string target);
}
Quindi, la nostra classe Sword può implementare questa interfaccia:
class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
E possiamo modificare la nostra classe Samurai:
class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Ora il nostro Samurai può essere armato con diverse armi. Ma aspetta! La spada è ancora creata all'interno del costruttore di Samurai. Poiché abbiamo ancora bisogno di modificare l'implementazione dei Samurai per dare al nostro guerriero un'altra arma, Samurai è ancora strettamente accoppiato a Sword.
Fortunatamente, esiste una soluzione semplice. Piuttosto che creare la Spada dall'interno del costruttore di Samurai, possiamo esporla invece come parametro del costruttore. Conosciuto anche come Iniezione costruttore.
class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Come ha sottolineato Giorgio, c'è anche un'iniezione di proprietà. Sarebbe qualcosa come:
class Samurai
{
IWeapon weapon;
public Samurai() { }
public void SetWeapon(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Spero che questo aiuti.