나는 전문가는 아니지만 도와 줄 수 있다고 생각합니다. 네, 특정 유형의 의존성 주입입니다.
면책 조항 :이 대부분 은 Ninject Wiki 에서 "도난당했습니다"
간단한 예를 통해 의존성 주입 개념을 살펴 보자. 고귀한 전사들이 큰 영광을 위해 싸우는 다음 블록 버스터 게임을 작성한다고 가정 해 봅시다. 먼저 전사를 무장시키기에 적합한 무기가 필요합니다.
class Sword
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
그런 다음 전사를 나타내는 클래스를 만들어 봅시다. 적을 공격하려면 전사는 Attack () 메소드가 필요합니다. 이 메소드가 호출되면 Sword를 사용하여 적을 공격해야합니다.
class Samurai
{
readonly Sword sword;
public Samurai()
{
this.sword = new Sword();
}
public void Attack(string target)
{
this.sword.Hit(target);
}
}
이제 사무라이를 만들고 전투를 할 수 있습니다!
class Program
{
public static void Main()
{
var warrior = new Samurai();
warrior.Attack("the evildoers");
}
}
당신이 상상할 수 있듯이 이것은 Chopped the evildoers 를 콘솔 에 반 으로 깨끗하게 인쇄 합니다. 이것은 잘 작동하지만 사무라이를 다른 무기로 무장시키고 싶다면 어떨까요? 검은 사무라이 클래스의 생성자 내부에서 생성되므로이 변경을 수행하려면 클래스 구현을 수정해야합니다.
클래스가 구체적인 종속성에 의존 할 때 클래스는 해당 클래스에 밀접하게 연결 되어 있다고합니다 . 이 예제에서 사무라이 클래스는 소드 클래스와 밀접하게 연결되어 있습니다. 클래스가 밀접하게 결합되면 구현을 변경하지 않고 교환 할 수 없습니다. 클래스를 단단히 결합하지 않기 위해 인터페이스를 사용하여 간접적 인 수준을 제공 할 수 있습니다. 게임에서 무기를 나타내는 인터페이스를 만들어 봅시다.
interface IWeapon
{
void Hit(string target);
}
그런 다음 Sword 클래스는 다음 인터페이스를 구현할 수 있습니다.
class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Chopped {0} clean in half", target);
}
}
사무라이 수업을 변경할 수 있습니다.
class Samurai
{
readonly IWeapon weapon;
public Samurai()
{
this.weapon = new Sword();
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
이제 사무라이는 다른 무기로 무장 할 수 있습니다. 하지만 기다려! 이 검은 여전히 사무라이의 생성자 안에 생성됩니다. 전사에게 다른 무기를 제공하기 위해 사무라이의 구현을 변경해야하므로 사무라이는 여전히 검과 밀접하게 연결되어 있습니다.
다행히도 쉬운 해결책이 있습니다. 사무라이 생성자 내에서 소드를 생성하는 대신 생성자의 매개 변수로 노출 할 수 있습니다. 생성자 주입이라고도합니다.
class Samurai
{
readonly IWeapon weapon;
public Samurai(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
조르지오가 지적했듯이 재산 주입도 있습니다. 그것은 다음과 같습니다.
class Samurai
{
IWeapon weapon;
public Samurai() { }
public void SetWeapon(IWeapon weapon)
{
this.weapon = weapon;
}
public void Attack(string target)
{
this.weapon.Hit(target);
}
}
도움이 되었기를 바랍니다.