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 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):

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 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 /// <summary>
11 /// 勇士
12 /// </summary>
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<IWeapon>().To<Sword>();
15 Bind<Samurai>().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<IWeapon>()); // 构造函数注入
16 Samurai s = kernal.Get<Samurai>();
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 }

以上代码附件:Ninject构造函数注入.rar
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 /// <summary>
11 /// 勇士
12 /// </summary>
13 public class Samurai
14 {
15 private IWeapon _weapon;
16
17 /// <summary>
18 /// 定义注入接口属性
19 /// </summary>
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<IWeapon>() };// 属性注入
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 /// <summary>
11 /// 勇士
12 /// </summary>
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<IWeapon>()); // 方法注入
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 /// <summary>
11 /// 勇士
12 /// </summary>
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<IWeapon>(); // 需将Samurai类中字段_weapon修饰符改为public才可以访问
17 s.Attack("enemy");
18
19 Console.ReadKey();
20 }
21 }
22 }

参考资料:
依赖注入
Ninject依赖注入——构造函数、属性、方法和字段的注入的更多相关文章
- Ninject依赖注入——构造函数的注入
1.Ninject简介 Ninject是基于.Net平台的依赖注入框架,它能够将应用程序分离成一个个高内聚.低耦合(loosely-coupled, highly-cohesive)的模块,然后以一种 ...
- ASP.NET Core 依赖注入(构造函数注入,属性注入等)
原文:ASP.NET Core 依赖注入(构造函数注入,属性注入等) 如果你不熟悉ASP.NET Core依赖注入,先阅读文章: 在ASP.NET Core中使用依赖注入 构造函数注入 构造函数注 ...
- spring依赖注入之构造函数注入,set方法注入
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- Ninject之旅之七:Ninject依赖注入
摘要 可以使用不同的模式向消费者类注入依赖项,向构造器里注入依赖项是其中一种.有一些遵循的模式用来注册依赖项,同时有一些需要避免的模式,因为他们经常导致不合乎需要的结果.这篇文章讲述那些跟Ninjec ...
- 依赖注入Bean属性
一.Bean属性依赖注入 对于类成员变量,注入方式有三种 •构造函数注入 •属性setter方法注入 •接口注入 Spring支持前两种 1.构造函数 属性注入 使用构造方法注入,在Spring配置文 ...
- Emit学习(3) - OpCodes - 动态添加属性、构造函数、方法
上一篇介绍了 IL 的部分, 基础的部分, 暂时就介绍到那里了, 接下来要进入代码编写阶段了. 今天的主题是 在代码运行的过程中, 去动态的创建类, 属性, 方法. 来源:http://www.cnb ...
- IOC 构造函数注入vs属性注入
1.不管是构造函数注入还是属性注入,都要先把对象给new 出来,构造函数应该也是public.2.一般使用 配置文件,属性注入,不用使用特性,直接配置,初始化或依赖,凡是注入的,都要有访问权限,pub ...
- spring构造函数注入、setter方法注入和接口注入
Spring开发指南中所说的三种注入方式: Type1 接口注入 我们常常借助接口来将调用者与实现者分离.如: public class ClassA { private InterfaceB clz ...
- [一]class 文件浅析 .class文件格式详解 字段方法属性常量池字段 class文件属性表 数据类型 数据结构
前言概述 本文旨在讲解class文件的整体结构信息,阅读本文后应该可以完整的了解class文件的格式以及各个部分的逻辑组成含义 class文件包含了java虚拟机指令集 和 符号表 以及若 ...
随机推荐
- Java一些八卦集合类
Map 和 Set关系 Map和Set事实基础的朋友,有着千丝万缕的联系. Map它可以被看作是Set延期.从何时起Set内容存储在key-value的值当表单.这个Set实际上可以作为Map使用.反 ...
- 彩色图像上执行Mean Shift迭代搜索目标 ,维加权直方图 + 巴氏系数 + Mean Shift迭代
今天要给大家分享的是: 在彩色图像上进行Mean Shift迭代搜索目标 二维加权直方图+巴氏系数+Mean Shift迭代 关于 加权直方图.巴氏系数.Mean Shift迭代 这三者之间的关系请大 ...
- 使用Enterprise Architecture绘制10种UML画画
UML绘制10种课程要求UML画画,选Enterprise Architecture作为一个绘图工具,每一个草图必须是网上找教程,我觉得很麻烦,还有一些数字并没有找到详细的教程.在我自己找一个绘图方法 ...
- .net Framework各个版本之间的发展
原文:.net Framework各个版本之间的发展 上个星期看到了.NET 4.0框架退休日期逐渐临近文章,发现自己一直在使用NET FrameWork,身为一个NET程序员,里面大概的区别自己还 ...
- three.js 来源目光(十三)Math/Ray.js
商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 - 本博客专注于 敏捷开发 ...
- java 选择文件夹对话框
java swing 选择文件夹对话框 import java.io.File; import javax.swing.JFileChooser; public class Test2 { publi ...
- php+flash头像上传组件
有会员系统的站点一般都会有一个头像上传组件,一般做的最简单的是 这样的方式长处是代码写的简单,仅仅要推断图片大小和类型,然后更新数据库.可是用户体验不高.并且站点其它页面假设要使用较小的20X20或1 ...
- 高效率的Shell
1. 批量将Excel转为CSV文件 XLSX2CSV: https://github.com/dilshod/xlsx2csv sudo easy_install xlsx2csv #安装Xlsx2 ...
- ASP.NET MVC中对Model进行分步验证的解决方法
原文:ASP.NET MVC中对Model进行分步验证的解决方法 在我之前的文章:ASP.NET MVC2.0结合WF4.0实现用户多步注册流程中将一个用户的注册分成了四步,而这四个步骤都是在完善一个 ...
- 日期格式化{0:yyyy-MM-dd HH:mm:ss.fff}和{0:yyyy-MM-dd hh:mm:ss.fff}的区别
原文:日期格式化{0:yyyy-MM-dd HH:mm:ss.fff}和{0:yyyy-MM-dd hh:mm:ss.fff}的区别 {0:yyyy-MM-dd HH:mm:ss.fff}:使用24小 ...