Ninject依赖注入——构造函数、属性、方法和字段的注入

前端之家收集整理的这篇文章主要介绍了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@H_403_15@ PM> Install-Package Ninject

3>、在项目中添加对Ninject的引用。

3、Ninject使用Modules and the Kernel注入

  Ninject中将类别以模块(Module)形式进行分组绑定,每一个模块代表应用程序的一个独立部分,这些模块可以根据需要进行组织。每一个模块都需要实现接口IModule@H_403_15@,多数采用扩展StandardModule类来便捷实现。

  Ninject依赖注入包括构造函数属性方法和字段的依赖注入。以下先通过构造函数注入方式进行说明,仍采用上节中使用的接口及类。

1>、Ninject构造函数依赖注入(Constructor Injection)

  武器接口IWeapon(IWeapon.cs):

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

  武器类Sword(Sword.cs):


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

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

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

class@H_403_15@ Program
static@H_403_15@ void@H_403_15@ Main(string@H_403_15@[] args)
14@H_403_15@ IKernel kernal = new@H_403_15@ StandardKernel(new@H_403_15@ WarriorModule());
15@H_403_15@ //@H_403_15@Samurai s = new Samurai(kernal.Get<IWeapon>()); @H_403_15@ 构造函数注入@H_403_15@16@H_403_15@ Samurai s = kernal.Get<Samurai>();
17@H_403_15@ s.Attack(enemy@H_403_15@"@H_403_15@);
18@H_403_15@
19@H_403_15@ Console.ReadKey();
20@H_403_15@ }
21@H_403_15@ }
22@H_403_15@ }
  如果需要的话,也可以创建多个模块(Module),将它们参数传递到Kernel的构造函数中。

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

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

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

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

  Samurai类注入属性

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

using@H_403_15@ System.Text;

using@H_403_15@ Ninject;

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

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

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

  Samurai类添加注入方法:

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

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

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

  Samurai类添加注入字段:

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

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

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

猜你在找的设计模式相关文章