Ninject(一)——手動依賴注入

猴小新發表於2012-04-26

手工依賴注入。在原有例子的基礎上做小部分修改。

一個RPG遊戲,有武士的角色。武士為了榮耀而戰。首先要為一個武士配備一個合適的武器。

(1) 準備一件武器(Sword)

public class Sword   

{

public void Hit(string strTarget)

{

        Console.WriteLine("砍死{0}",strTarget);

}

}

 

(2)一個武士角色

public class Samurai

{

Sword _sword ;

public Samurai()

{

_sword = new Sword();

}

public void Attack(string strTarget)

{

    _sword.Hit(strTarget);

}

}

(3)測試

[Test]

public void Test1()

{

Samurai sam = new Samurai();

sam.Attack("殭屍");

}

結果:

砍死殭屍

當一個類依賴於一個具體實現時,稱為:這個類對具體實現的類緊耦合。武士類對劍類緊耦合。當類緊耦合時,它們不能在不通知它們的實現的情況下完成自身的修改。如果要更換武器,那麼因為武士類對劍類緊耦合,那麼在修改武器的時候,還要修改對劍類緊耦合的武士本身。為了避免緊耦合的類。我們通常通過介面來提供間接的層面。

(4)介面實現

public interface IWeapon

{

void Hit(string target);

}

public class Sword : IWeapon

{

public void Hit(string strTarget)

{

    Console.WriteLine("砍死{0}",strTarget);

}

}

public class Samurai

{

IWeapon _Weapon;

public Samurai()

{

       _Weapon = new Sword();

}

public void Attack(string strTarget)

{

       _Weapon.Hit(strTarget);

}

}

現在武器可以裝備不同的武器了。但是,劍類物件仍然是在武士物件的構造器中建立的。我們仍然需要在為武士裝備另一種武器的時候還要通知武士的實現,武士類仍然對劍類緊耦合。這裡有一個簡單的解決方法。與其在武士類構造器內部建立劍類的例項,不如以構造引數的方式來代替。

(5)構造引數

public Samurai(IWeapon Weapon)

{

   _Weapon = Weapon;

}

public void Test1()

{

   Samurai sam = new Samurai(new Sword());

   sam.Attack("殭屍");

}

現在,裝備武士,可以通過向武士類的構造方法向武士類注入武器(劍)。這是一個依賴注入的例子(具體來說是一個構造注入)。現在建立另一種可能用到的武器:

(6)新增武器

public class Shuriken : IWeapon

{

public void Hit(string target)

{

       Console.WriteLine("刺穿{0}的咽喉 ", target);

}

}

(7)測試

Samurai sam = new Samurai(new Sword());

Samurai sam2 = new Samurai(new Shuriken());

sam.Attack("殭屍");

sam2.Attack("殭屍");

任何時候,當要建立一個武士角色時,首先必須建立一個武器介面的實現,然後把它傳到武士的構造器中。現在修改武士武器的時候,不用再來修改這個武士類的實現了,這個武士類的程式集可以和武器類的程式集分開了。事實上,我們可以在不需要武士類原始檔的情況下新增新武器了。手動依賴注入對於小型的專案來說是個有效的策略。

相關文章