前端之家收集整理的这篇文章主要介绍了
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 get24 {
25 return _weapon;
26 }
27 set28 {
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 }