Ninject紹介

12255 ワード

このシリーズのメモはNinjectの公式サイトから来ました.http://www.ninject.org/wiki.html.
一,Ninject紹介
Ninjectは.netプラットフォームの依存注入フレームであり、Ninjectによって、私たちのプログラムがメンテナンスと修正しやすくなります.
依存入力を手動で実現
例を見てください.今はコンソールのプロジェクトをして、兵士がテロリストに対抗するゲームをします.まず武器を作ります.剣です.
1   class Sword

2     {

3         public void Hit(string target)

4         {

5             Console.WriteLine("Chopped {0} clean in half",target);

6         }

7     }
そして私達はもう一つの兵士を創建します.
 1 class Samurai

 2     {

 3         readonly Sword sword;

 4         public Samurai()

 5         {

 6             this.sword = new Sword();

 7         }

 8 

 9         public void Attack(string targer)

10         {

11             this.sword.Hit(targer);

12         }

13     }
最後に、メインプログラムで、兵士に敵を攻撃させます.
 1  class Program

 2     {

 3         static void Main(string[] args)

 4         {

 5             var warrior = new Samurai();

 6             warrior.Attack("the evildoers");

 7 

 8             Console.Read();

 9         }

10     }
プログラムを実行して、私達が得た結果は:
Chopped the evildoers clean in half
今の問題は、私達の剣は私達の兵士にとって攻撃力が低いです.武士刀に変えたいですが、どうすればいいですか?
もちろん武士刀類をもう一つ作って、サムライ類の中でSwordをサムライナイフに変えてもいいです.しかし、このようにしてサムライとサムライの刀類を分けずに結合しています.これからは侍刀を手**銃に変えたいと思います.サムライ類を再度変更する必要があります.これはプログラム設計の「追加開発に対して、閉鎖を修正する」という考え方とは違っています.注に依存する考えは、プログラムを高凝集、低結合の特性に設計することである.インタフェースを通して、私たちは目的を実現することができます.
IWeapponインターフェースを作成:
1   interface IWeapon

2     {

3         public void Hit(string target);

4     }
武士刀類を作成し、IWeapanインターフェースを実現させます.
1   class Shuriken:IWeapon

2     {

3         public void Hit(string target)

4         {

5             Console.WriteLine("Pierced {0}'s armor", target);

6         }

7     }
同じSwordクラスにIWeapponインターフェースを実現させる:
1 class Sword:IWeapon

2     {

3         public void Hit(string target)

4         {

5             Console.WriteLine("Chopped {0} clean in half",target);

6         }

7     }
兵士の内部では、具体的な武器はどれですか?
 1 class Samurai

 2     {

 3         readonly IWeapon weapon;

 4         public Samurai()

 5         {

 6             this.weapon = new Sword();

 7         }

 8 

 9         public void Attack(string targer)

10         {

11             this.weapon.Hit(targer);

12         }

13     }
しかし、上のコードは完全に結合する目的を果たしていません.その中にはまだSwordという類が関連していますので、どの類をコンストラクタに指定して、インタフェースで代替することができます.このようにして、具体的な武器類と完全に結合する目的を果たしました.
 1  class Samurai

 2     {

 3         readonly IWeapon weapon;

 4         public Samurai(IWeapon weapon)

 5         {

 6             this.weapon = weapon;

 7         }

 8 

 9         public void Attack(string targer)

10         {

11             this.weapon.Hit(targer);

12         }

13     }
メインプログラム:
 1  class Program

 2     {

 3         static void Main(string[] args)

 4         {

 5             var warrior = new Samurai(new Sword());

 6             var warrior2 = new Samurai(new Shuriken());

 7             warrior.Attack("the evildoers");

 8             warrior2.Attack("the evildoers");

 9 

10             Console.Read();

11         }

12     }
具体的な武器の構造をメインプログラムに持ってきて、兵士類と武器類を完全に分離して、その後手*銃類を手に入れたいなら、手*銃類を一つ作って、IWeapan類を実現すれば、メインプログラムの中で自由に手*銃を装備した兵士を創建することができます.
これは手动で注に依存するプロセスを実现しています.小さいプロジェクトの中でこのようにするのは何の问题もありません.しかし、プロジェクトが大きくなると、これは不适切かもしれません.书くと、NinjectのようなIocの枠组みができます.