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 }
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 }
10 class WarriorModule : NinjectModule
11 {
12 override void Load()
13 {
14 Bind<IWeapon>().To<Sword>();
15 Bind<Samurai>().ToSelf();
创建模块(Module)后,将它们加载到Kernel容器中。调用Kernel的Get()方法,获取Ninject的类别实例。
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 }
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类注入属性:
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 }
using Ninject;
namespace NInjectApp
{
class Program
{
string[] args)
{
IKernel kernal = new WarriorModule());
Samurai s = new Samurai() { Weapon = kernal.Get<IWeapon>() }; 属性注入
s.Attack(");
Console.ReadKey();
}
}
}
Ninject可以有多个方法(Method)声明[Inject]属性(Attribute)。
Program类调用注入方法:
16 s.Arm(kernal.Get<IWeapon>()); 方法注入 4>、Ninject字段注入(Field Injection)
Ninject可以有多个字段(Field)声明[Inject]属性(Attribute),但在实际应用中尽量避免使用字段注入。
Samurai类添加注入字段:
16 17
20 _weapon.Hit(target);
22 }
23 }
参考资料:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。