Uzman değilim ama yardım edebileceğimi düşünüyorum. Ve evet, belirli bir Bağımlılık Enjeksiyonu türüdür.
Feragatname: Neredeyse bunların tamamı Ninject Wiki'den "çalındı"
Bağımlılık enjeksiyonu fikrini basit bir örnek kullanarak yürüterek inceleyelim. Diyelim ki sıradaki gişe rekorları kıran oyunu yazıyorsunuz, soylu savaşçıların büyük zafer için savaş yaptıkları yer. İlk önce, savaşçılarımızı silahlandırmaya uygun bir silaha ihtiyacımız olacak.
class Sword
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Öyleyse savaşçılarımızı kendileri temsil edecek bir sınıf oluşturalım. Düşmanlarına saldırmak için savaşçı bir Attack () yöntemine ihtiyaç duyacak. Bu yöntem çağrıldığında, rakibini vurmak için Kılıcını kullanmalıdır.
class Samurai
{
readonly Sword sword;
public Samurai()
{
this.sword = new Sword();
}
public void Attack(string target)
{
this.sword.Hit(target);
}
}
Şimdi, Samuray'larımızı yaratabilir ve savaş yapabiliriz!
class Program
{
public static void Main()
{
var warrior = new Samurai();
warrior.Attack("the evildoers");
}
}
Tahmin edebileceğiniz gibi, bu yazdıracak Doğranmış köpeği konsola yarısında temizleyin . Bu iyi çalışıyor, ama ya Samuray'larımızı başka bir silahla silahlandırmak istersek? Kılıç, Samuray sınıfının kurucusu içinde yaratıldığından, bu değişikliği yapabilmek için sınıfın uygulamasını değiştirmeliyiz.
Bir sınıf somut bir bağımlılığa bağlı olduğunda, o sınıfa sıkı bir şekilde bağlı olduğu söylenir . Bu örnekte, Samuray sınıfı, Kılıç sınıfına sıkıca bağlanmıştır. Sınıflar sıkıca birleştirildiğinde, uygulamalarını değiştirmeden değiştirilemezler. Sıkı kavrama sınıflarından kaçınmak için, bir dolaylı seviye sağlamak için arayüzleri kullanabiliriz. Oyunumuzda bir silahı temsil edecek bir arayüz oluşturalım.
interface IWeapon
{
void Hit(string target);
}
Daha sonra Kılıç sınıfımız bu arayüzü uygulayabilir:
class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
Samuray sınıfımızı değiştirebiliriz:
class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Şimdi Samuraylarımız farklı silahlarla silahlandırılabilir. Fakat bekle! Kılıç, hala Samuray'ın kurucusu içinde yaratılmıştır. Savaşçımıza başka bir silah vermek için Samuray'ın uygulamasını değiştirmeye devam etmemiz gerektiğinden, Samuray hala Kılıç'la sıkı sıkıya bağlantılı.
Neyse ki, kolay bir çözüm var. Kılıcı Samurayın kurucusundan yaratmak yerine, onu yapıcı parametresi olarak gösterebiliriz. Ayrıca Yapıcı Enjeksiyonu olarak da bilinir.
class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Giorgio'nun belirttiği gibi, mülk enjeksiyonu da var. Bu gibi bir şey olurdu:
class Samurai
{
IWeapon weapon;
public Samurai() { }
public void SetWeapon(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
Bu yardımcı olur umarım.