Ninject依賴注入——構造函數、屬性、方法和字段的注入(三)


1、Ninject簡介

  Ninject是基於.Net平台的依賴注入框架,它能夠將應用程序分離成一個個高內聚、低耦合(loosely-coupled, highly-cohesive)的模塊,然后以一種靈活的方式組織起來。Ninject可以使代碼變得更容易編寫、重用、測試和修改。

  Ninject官方網址為:http://www.ninject.org/

2、項目引用Ninject

1>、 Tools -> Libaary Package Manager -> Package Manager Console,打開Package Manager Console窗口;

2>、在Package Manager Console窗口中輸入指令,Enter;

1 PM> Install-Package Ninject

3>、在項目中添加對Ninject的引用。

3、Ninject使用Modules and the Kernel注入

  Ninject中將類別以模塊(Module)形式進行分組綁定,每一個模塊代表應用程序的一個獨立部分,這些模塊可以根據需要進行組織。每一個模塊都需要實現接口IModule,多數采用擴展StandardModule類來便捷實現。

  Ninject依賴注入包括構造函數、屬性、方法和字段的依賴注入。以下先通過構造函數注入方式進行說明,仍采用上節中使用的接口及類。

1>、Ninject構造函數依賴注入(Constructor Injection)

  武器接口IWeapon(IWeapon.cs):

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace NInjectApp
7 {
8 /// <summary>
9   /// 武器
10   /// </summary>
11 public interface IWeapon
12 {
13 void Hit(string target);
14 }
15 }

  武器類Sword(Sword.cs):

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace NInjectApp
7 {
8 /// <summary>
9   ///
10   /// </summary>
11 public class Sword : IWeapon
12 {
13 public void Hit(string target)
14 {
15 Console.WriteLine("Hit the target {0} by sword", target);
16 }
17 }
18 }

  勇士類Samurai(Samurai.cs),在構造函數Samurai中添加[Inject]屬性(Attribute)。

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 using Ninject;
7
8 namespace NInjectApp
9 {
10 /// <summary>
11   /// 勇士
12   /// </summary>
13 public class Samurai
14 {
15 private IWeapon _weapon;
16
17 [Inject]
18 public Samurai(IWeapon weapon)
19 {
20 _weapon = weapon;
21 }
22
23 public void Attack(string target)
24 {
25 _weapon.Hit(target);
26 }
27 }
28 }

  添加勇士類別綁定模塊類WarriorModule(WarriorModule.cs)。

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 using Ninject.Modules;
7
8 namespace NInjectApp
9 {
10 public class WarriorModule : NinjectModule
11 {
12 public override void Load()
13 {
14 Bind<IWeapon>().To<Sword>();
15 Bind<Samurai>().ToSelf();
16 }
17 }
18 }

  創建模塊(Module)后,將它們加載到Kernel容器中。調用Kernel的Get()方法,獲取Ninject的類別實例。

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 using Ninject;
7
8 namespace NInjectApp
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 IKernel kernal = new StandardKernel(new WarriorModule());
15 //Samurai s = new Samurai(kernal.Get<IWeapon>()); // 構造函數注入
16 Samurai s = kernal.Get<Samurai>();
17 s.Attack("enemy");
18
19 Console.ReadKey();
20 }
21 }
22 }

  如果需要的話,也可以創建多個模塊(Module),將它們參數傳遞到Kernel的構造函數中。

 1 public class Module1 {
2 public override void Load() { ... }
3 }
4
5 public class Module2 {
6 public override void Load() { ... }
7 }
8
9 class Program {
10 public static void Main()
11 {
12 IKernel kernel = new StandardKernel(new Module1(), new Module2(), ...);
13 ...
14 }
15 }

  以上代碼附件:Ninject構造函數注入.rar

2>、Ninject屬性依賴注入(Property Injection)

  與構造函數注入不同,可以有多個屬性(Property)聲明[Inject] Attribute。

  修改Samurai類和Program類,其他不變。

  Samurai類注入屬性:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 using Ninject;
7
8 namespace NInjectApp
9 {
10 /// <summary>
11   /// 勇士
12   /// </summary>
13 public class Samurai
14 {
15 private IWeapon _weapon;
16
17 /// <summary>
18      /// 定義注入接口屬性
19      /// </summary>
20 [Inject]
21 public IWeapon Weapon
22 {
23 get
24 {
25 return _weapon;
26 }
27 set
28 {
29 _weapon = value;
30 }
31 }
32
33 public void Attack(string target)
34 {
35 _weapon.Hit(target);
36 }
37 }
38 }

  Program類調用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Ninject;

namespace NInjectApp
{
class Program
{
static void Main(string[] args)
{
IKernel kernal = new StandardKernel(new WarriorModule());
Samurai s = new Samurai() { Weapon = kernal.Get<IWeapon>() };// 屬性注入
s.Attack("enemy");

Console.ReadKey();
}
}
}

3>、Ninject方法注入(Method Injection)

  Ninject可以有多個方法(Method)聲明[Inject]屬性(Attribute)。

  修改Samurai類和Program類,其他不變。

  Samurai類添加注入方法:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 using Ninject;
7
8 namespace NInjectApp
9 {
10 /// <summary>
11   /// 勇士
12   /// </summary>
13 public class Samurai
14 {
15 private IWeapon _weapon;
16
17 [Inject]
18 public void Arm(IWeapon weapon)
19 {
20 _weapon = weapon;
21 }
22
23 public void Attack(string target)
24 {
25 _weapon.Hit(target);
26 }
27 }
28 }

  Program類調用注入方法:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 using Ninject;
7
8 namespace NInjectApp
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 IKernel kernal = new StandardKernel(new WarriorModule());
15 Samurai s = new Samurai();
16 s.Arm(kernal.Get<IWeapon>()); // 方法注入
17 s.Attack("enemy");
18
19 Console.ReadKey();
20 }
21 }
22 }

4>、Ninject字段注入(Field Injection)

  Ninject可以有多個字段(Field)聲明[Inject]屬性(Attribute),但在實際應用中盡量避免使用字段注入。

  修改Samurai類和Program類,其他不變。

  Samurai類添加注入字段:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 using Ninject;
7
8 namespace NInjectApp
9 {
10 /// <summary>
11   /// 勇士
12   /// </summary>
13 public class Samurai
14 {
15 [Inject]
16 private IWeapon _weapon;
17
18 public void Attack(string target)
19 {
20 _weapon.Hit(target);
21 }
22 }
23 }

  Program類中調用注入字段:

 1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 using Ninject;
7
8 namespace NInjectApp
9 {
10 class Program
11 {
12 static void Main(string[] args)
13 {
14 IKernel kernal = new StandardKernel(new WarriorModule());
15 Samurai s = new Samurai();
16 s._weapon = kernal.Get<IWeapon>(); // 需將Samurai類中字段_weapon修飾符改為public才可以訪問
17 s.Attack("enemy");
18
19 Console.ReadKey();
20 }
21 }
22 }


參考資料:

http://ninject.codeplex.com/wikipage?title=Injection%20Patterns&referringTitle=Dependency%20Injection%20With%20Ninject






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM