前端之家收集整理的这篇文章主要介绍了
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):
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@ }
武器类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@ }