博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Ninject依赖注入——构造函数、属性、方法和字段的注入(三)
阅读量:6479 次
发布时间:2019-06-23

本文共 6999 字,大约阅读时间需要 23 分钟。

1、Ninject简介

  Ninject是基于.Net平台的依赖注入框架,它能够将应用程序分离成一个个高内聚、低耦合(loosely-coupled, highly-cohesive)的模块,然后以一种灵活的方式组织起来。Ninject可以使代码变得更容易编写、重用、测试和修改。

  Ninject官方网址为: 。

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 /// 9   /// 武器 10   /// 11 public interface IWeapon 12 {
13 void Hit(string target); 14 } 15 }

  武器类Sword(Sword.cs):

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5  6 namespace NInjectApp  7 {
8 /// 9   /// 刀 10   /// 11 public class Sword : IWeapon 12 {
13 public void Hit(string target) 14 {
15 Console.WriteLine("Hit the target {0} by sword", target); 16 } 17 } 18 }

  勇士类Samurai(Samurai.cs),在构造函数Samurai中添加[Inject]属性(Attribute)。

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5  6 using Ninject;  7  8 namespace NInjectApp  9 {
10 /// 11   /// 勇士 12   /// 13 public class Samurai 14 {
15 private IWeapon _weapon; 16 17 [Inject] 18 public Samurai(IWeapon weapon) 19 {
20 _weapon = weapon; 21 } 22 23 public void Attack(string target) 24 {
25 _weapon.Hit(target); 26 } 27 } 28 }

  添加勇士类别绑定模块类WarriorModule(WarriorModule.cs)。

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5  6 using Ninject.Modules;  7  8 namespace NInjectApp  9 {
10 public class WarriorModule : NinjectModule 11 {
12 public override void Load() 13 {
14 Bind
().To
(); 15 Bind
().ToSelf(); 16 } 17 } 18 }

  创建模块(Module)后,将它们加载到Kernel容器中。调用Kernel的Get()方法,获取Ninject的类别实例。

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5  6 using Ninject;  7  8 namespace NInjectApp  9 {
10 class Program 11 {
12 static void Main(string[] args) 13 {
14 IKernel kernal = new StandardKernel(new WarriorModule()); 15 //Samurai s = new Samurai(kernal.Get
()); // 构造函数注入 16 Samurai s = kernal.Get
(); 17 s.Attack("enemy"); 18 19 Console.ReadKey(); 20 } 21 } 22 }

  如果需要的话,也可以创建多个模块(Module),将它们参数传递到Kernel的构造函数中。

1 public class Module1 {
2 public override void Load() { ... } 3 } 4 5 public class Module2 {
6 public override void Load() { ... } 7 } 8 9 class Program {
10 public static void Main() 11 {
12 IKernel kernel = new StandardKernel(new Module1(), new Module2(), ...); 13 ... 14 } 15 }

  以上代码附件:

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

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

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

  Samurai类注入属性:

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5  6 using Ninject;  7  8 namespace NInjectApp  9 {
10 /// 11   /// 勇士 12   /// 13 public class Samurai 14 {
15 private IWeapon _weapon; 16 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 public void Attack(string target) 34 {
35 _weapon.Hit(target); 36 } 37 } 38 }

  Program类调用:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Ninject; namespace NInjectApp {
class Program {
static void Main(string[] args) {
IKernel kernal = new StandardKernel(new WarriorModule()); Samurai s = new Samurai() { Weapon = kernal.Get
() };// 属性注入 s.Attack("enemy"); Console.ReadKey(); } } }

3>、Ninject方法注入(Method Injection)

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

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

  Samurai类添加注入方法:

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5  6 using Ninject;  7  8 namespace NInjectApp  9 {
10 /// 11   /// 勇士 12   /// 13 public class Samurai 14 {
15 private IWeapon _weapon; 16 17 [Inject] 18 public void Arm(IWeapon weapon) 19 {
20 _weapon = weapon; 21 } 22 23 public void Attack(string target) 24 {
25 _weapon.Hit(target); 26 } 27 } 28 }

  Program类调用注入方法:

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5  6 using Ninject;  7  8 namespace NInjectApp  9 {
10 class Program 11 {
12 static void Main(string[] args) 13 {
14 IKernel kernal = new StandardKernel(new WarriorModule()); 15 Samurai s = new Samurai(); 16 s.Arm(kernal.Get
()); // 方法注入 17 s.Attack("enemy"); 18 19 Console.ReadKey(); 20 } 21 } 22 }

4>、Ninject字段注入(Field Injection)

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

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

  Samurai类添加注入字段:

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5  6 using Ninject;  7  8 namespace NInjectApp  9 {
10 /// 11   /// 勇士 12   /// 13 public class Samurai 14 {
15 [Inject] 16 private IWeapon _weapon; 17 18 public void Attack(string target) 19 {
20 _weapon.Hit(target); 21 } 22 } 23 }

  Program类中调用注入字段:

1 using System;  2 using System.Collections.Generic;  3 using System.Linq;  4 using System.Text;  5  6 using Ninject;  7  8 namespace NInjectApp  9 {
10 class Program 11 {
12 static void Main(string[] args) 13 {
14 IKernel kernal = new StandardKernel(new WarriorModule()); 15 Samurai s = new Samurai(); 16 s._weapon = kernal.Get
(); // 需将Samurai类中字段_weapon修饰符改为public才可以访问 17 s.Attack("enemy"); 18 19 Console.ReadKey(); 20 } 21 } 22 }

参考资料:

转载地址:http://quwuo.baihongyu.com/

你可能感兴趣的文章
集合异常之List接口
查看>>
Softmax回归
查看>>
紫书 习题11-11 UVa 1644 (并查集)
查看>>
App工程结构搭建:几种常见Android代码架构分析
查看>>
使用openssl进行证书格式转换
查看>>
ZOJ 3777 Problem Arrangement
查看>>
Callable和Future
查看>>
installshield12如何改变默认安装目录
查看>>
少用数字来作为参数标识含义
查看>>
ScrollView中嵌套ListView
查看>>
JAVA虚拟机05--面试必问之JVM原理
查看>>
Algs4-2.3.1如何切分数组
查看>>
观察者模式
查看>>
在properties.xml中定义变量,在application.xml中取值问题
查看>>
js 数组
查看>>
Linux scp命令详解
查看>>
struct和typedef struct
查看>>
cell reuse & disposebag
查看>>
【故障处理】ORA-12545: Connect failed because target host or object does not exist
查看>>
云时代,程序员将面临的分化
查看>>