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):


class Sword : IWeapon
string target)
14 {
15 Console.WriteLine("Hit the target {0} by sword",target);
16 }
17 }
18 }
  勇士类Samurai(Samurai.cs),在构造函数Samurai中添加[Inject]属性(Attribute)。

using Ninject;
7
8 9 {
10 11   /// 勇士
12 13 class Samurai
14 {
15 private IWeapon _weapon;
16
17 [Inject]
18 public Samurai(IWeapon weapon)
19 {
20 _weapon = weapon;
21 }
22
23 void Attack(24 {
25 _weapon.Hit(target);
26 }
27 }
28 }
  添加勇士类别绑定模块类WarriorModule(WarriorModule.cs)。

using Ninject.Modules;
10 class WarriorModule : NinjectModule
11 {
12 override void Load()
13 {
14 Bind<IWeapon>().To<Sword>();
15 Bind<Samurai>().ToSelf();
  创建模块(Module)后,将它们加载到Kernel容器中。调用Kernel的Get()方法获取Ninject的类别实例。

class Program
static void Main(string[] args)
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的构造函数中。

class Module1 {
2 override void Load() { ... }
3 }
4
5 class Module2 {
6 7 }
8
9 class Program {
10 void Main()
11 {
12 IKernel kernel = new Module1(),new Module2(),...);
13 ...
14 }
  以上代码附件:Ninject构造函数注入.rar

2>、Ninject属性依赖注入(Property Injection)

  与构造函数注入不同,可以有多个属性(Property)声明[Inject] Attribute。

  修改Samurai类和Program类,其他不变。

  Samurai类注入属性

17 18      /// 定义注入接口属性
19      /// 20 [Inject]
21 public IWeapon Weapon
22 {
23 get
24 {
25 return _weapon;
26 }
27 set
28 {
29 _weapon = value;
30 }
31 }
32
33 34 {
35 _weapon.Hit(target);
36 }
37 }
38 }
  Program类调用

using System.Text;

using Ninject;

namespace NInjectApp
{
class Program
{
string[] args)
{
IKernel kernal = new WarriorModule());
Samurai s = new Samurai() { Weapon = kernal.Get<IWeapon>() }; 属性注入
s.Attack(");

Console.ReadKey();
}
}
}
3>、Ninject方法注入(Method Injection)

  Ninject可以有多个方法(Method)声明[Inject]属性(Attribute)。

  Samurai类添加注入方法:

11   12   void Arm(IWeapon weapon)
  Program类调用注入方法:

15 Samurai s = new Samurai();
16 s.Arm(kernal.Get<IWeapon>()); 方法注入 4>、Ninject字段注入(Field Injection)

  Ninject可以有多个字段(Field)声明[Inject]属性(Attribute),但在实际应用中尽量避免使用字段注入。

  Samurai类添加注入字段:

15 [Inject]
16 17
20 _weapon.Hit(target);
22 }
23 }
  Program类中调用注入字段:

16 s._weapon = kernal.Get<IWeapon>(); 需将Samurai类中字段_weapon修饰符改为public才可以访问
参考资料:

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

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...