Saya bukan ahli, tapi saya pikir saya bisa membantu. Dan ya, itu adalah tipe Injeksi Ketergantungan khusus.
Penafian: Hampir semua ini "dicuri" dari Ninject Wiki
Mari kita periksa ide injeksi ketergantungan dengan berjalan melalui contoh sederhana. Katakanlah Anda sedang menulis game blockbuster berikutnya, di mana para prajurit bangsawan melakukan pertempuran untuk kemuliaan besar. Pertama, kita akan membutuhkan senjata yang cocok untuk mempersenjatai prajurit kita.
class Sword
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Lalu, mari kita buat kelas untuk mewakili prajurit kita sendiri. Untuk menyerang lawannya, prajurit akan membutuhkan metode Serangan (). Ketika metode ini dipanggil, ia harus menggunakan Pedangnya untuk menyerang lawannya.
class Samurai
{
readonly Sword sword;
public Samurai()
{
this.sword = new Sword();
}
public void Attack(string target)
{
this.sword.Hit(target);
}
}
Sekarang, kita bisa membuat Samurai kita dan melakukan pertempuran!
class Program
{
public static void Main()
{
var warrior = new Samurai();
warrior.Attack("the evildoers");
}
}
Seperti yang mungkin Anda bayangkan, ini akan mencetak Cincang para penjahat bersih setengah menjadi konsol. Ini bekerja dengan baik, tetapi bagaimana jika kita ingin mempersenjatai Samurai kita dengan senjata lain? Karena Pedang dibuat di dalam konstruktor kelas Samurai, kita harus memodifikasi implementasi kelas untuk membuat perubahan ini.
Ketika suatu kelas tergantung pada ketergantungan konkret, itu dikatakan tergabung erat dengan kelas itu . Dalam contoh ini, kelas Samurai sangat erat dengan kelas Pedang. Ketika kelas-kelas digabungkan secara ketat, mereka tidak dapat dipertukarkan tanpa mengubah implementasinya. Untuk menghindari kelas kopling ketat, kita dapat menggunakan antarmuka untuk memberikan tingkat tipuan. Mari kita buat antarmuka untuk mewakili senjata di gim kita.
interface IWeapon
{
void Hit(string target);
}
Kemudian, kelas Sword kami dapat mengimplementasikan antarmuka ini:
class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Dan kita dapat mengubah kelas Samurai kita:
class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Sekarang Samurai kita dapat dipersenjatai dengan senjata yang berbeda. Tapi tunggu! Pedang masih dibuat di dalam konstruktor Samurai. Karena kita masih perlu mengubah implementasi Samurai untuk memberikan prajurit kita senjata lain, Samurai masih tergabung erat dengan Sword.
Untungnya, ada solusi mudah. Daripada menciptakan Pedang dari dalam konstruktor Samurai, kita dapat mengeksposnya sebagai parameter konstruktor sebagai gantinya. Juga dikenal sebagai Injeksi Konstruktor.
class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Seperti yang ditunjukkan Giorgio, ada juga injeksi properti. Itu akan menjadi sesuatu seperti:
class Samurai
{
IWeapon weapon;
public Samurai() { }
public void SetWeapon(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Semoga ini membantu.