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;
PM> Install-Package Ninject
3>、在项目中添加对Ninject的引用。

3、Ninject使用Modules and the Kernel注入
Ninject中将类别以模块(Module)形式进行分组绑定,每一个模块代表应用程序的一个独立部分,这些模块可以根据需要进行组织。每一个模块都需要实现接口IModule,多数采用扩展StandardModule类来便捷实现。
Ninject依赖注入包括构造函数、属性、方法和字段的依赖注入。以下先通过构造函数注入方式进行说明,仍采用上节中使用的接口及类。
1>、Ninject构造函数依赖注入(Constructor Injection)
武器接口IWeapon(IWeapon.cs):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace NInjectApp
{
/// <summary>
/// 武器
/// </summary>
public interface IWeapon
{
void Hit(string target);
}
}
武器类Sword(Sword.cs):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace NInjectApp
{
/// <summary>
/// 刀
/// </summary>
public class Sword : IWeapon
{
public void Hit(string target)
{
Console.WriteLine("Hit the target {0} by sword", target);
}
}
}
勇士类Samurai(Samurai.cs),在构造函数Samurai中添加[Inject]属性(Attribute)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Ninject; namespace NInjectApp
{
/// <summary>
/// 勇士
/// </summary>
public class Samurai
{
private IWeapon _weapon; [Inject]
public Samurai(IWeapon weapon)
{
_weapon = weapon;
} public void Attack(string target)
{
_weapon.Hit(target);
}
}
}
添加勇士类别绑定模块类WarriorModule(WarriorModule.cs)。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Ninject.Modules; namespace NInjectApp
{
public class WarriorModule : NinjectModule
{
public override void Load()
{
Bind<IWeapon>().To<Sword>();
Bind<Samurai>().ToSelf();
}
}
}
创建模块(Module)后,将它们加载到Kernel容器中。调用Kernel的Get()方法,获取Ninject的类别实例。
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(kernal.Get<IWeapon>()); // 构造函数注入
Samurai s = kernal.Get<Samurai>();
s.Attack("enemy"); Console.ReadKey();
}
}
}
如果需要的话,也可以创建多个模块(Module),将它们参数传递到Kernel的构造函数中。
public class Module1 {
public override void Load() { ... }
}
public class Module2 {
public override void Load() { ... }
}
class Program {
public static void Main()
{
IKernel kernel = new StandardKernel(new Module1(), new Module2(), ...);
...
}
}
Ninject依赖注入——构造函数的注入的更多相关文章
- Ninject依赖注入——构造函数、属性、方法和字段的注入
Ninject依赖注入——构造函数.属性.方法和字段的注入(三) 1.Ninject简介 Ninject是基于.Net平台的依赖注入框架,它能够将应用程序分离成一个个高内聚.低耦合(loosely-c ...
- Ninject之旅之七:Ninject依赖注入
摘要 可以使用不同的模式向消费者类注入依赖项,向构造器里注入依赖项是其中一种.有一些遵循的模式用来注册依赖项,同时有一些需要避免的模式,因为他们经常导致不合乎需要的结果.这篇文章讲述那些跟Ninjec ...
- 在MVC5中使用Ninject 依赖注入
各大主流.Net的IOC框架性能测试比较 : http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html 使用NuGet ...
- WebApi中使用Ninject 依赖注入
之前Ninject依赖注入是在MVC中使用,最近在WebApi中使用,用之前的MVC方式发现使用接口注入,一直是Null错误,网上查询了一些资源,总结一下,以后备用. 主要分为以下几步骤: 在NuGe ...
- ASP.NET Core 依赖注入(构造函数注入,属性注入等)
原文:ASP.NET Core 依赖注入(构造函数注入,属性注入等) 如果你不熟悉ASP.NET Core依赖注入,先阅读文章: 在ASP.NET Core中使用依赖注入 构造函数注入 构造函数注 ...
- IOC 构造函数注入vs属性注入
1.不管是构造函数注入还是属性注入,都要先把对象给new 出来,构造函数应该也是public.2.一般使用 配置文件,属性注入,不用使用特性,直接配置,初始化或依赖,凡是注入的,都要有访问权限,pub ...
- Spring 依赖注入中 Field 注入的有害性
大致分为:Field 注入.构造注入.setter 注入 其中 Field 注入被认为有害的: 1. 违反了单一原则 当一个 class 中有多个依赖时,如果仅仅使用 Field 注入,则看不出有很多 ...
- Spring 依赖注入(基本注入和自动适配注入)
Spring 依赖注入 Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系. 属性注入 构造注入 内部注入 自动装配 1.属性注入 IService: public in ...
- Spring学习笔记1—依赖注入(构造器注入、set注入和注解注入)
什么是依赖注入 在以前的java开发中,某个类中需要依赖其它类的方法时,通常是new一个依赖类再调用类实例的方法,这种方法耦合度太高并且不容易测试,spring提出了依赖注入的思想,即依赖类不由程序员 ...
随机推荐
- vim操作笔记
1.切换到下一个文件 假设要切换的文件名为 test.py :ex test.py 2.文档内复制命令 yy "复制光标所在行.或大写一个Y. 2yy "复制两行. y^ &quo ...
- FOOD
Serving order of food courses(上菜顺序)1. Appetizer(starter)2. Main Course3. Dessert Style of cooking1. ...
- 基于spring-redis发布订阅模式的实现
redis配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http ...
- [Java] 通过文件流拷贝文件
package test.stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...
- 【转】Python处理HTML转义字符
Python处理HTML转义字符 转 [http://www.cnblogs.com/xuxn/archive/2011/08/12/parse-html-escape-characters-in-p ...
- 使用 Heka 导入自定义的nginx日志到Elasticsearch
重置Heka执行进度 heka的进度配置文件存在配置项 base_dir 设置的目录,只需要删除这个文件夹下面的内容,就可以完全重置heka的进度. base_dir 配置项默认是在下面目录: '/v ...
- [kuangbin带你飞]专题七 线段树
ID Origin Title 228 / 440 Problem A HDU 1166 敌兵布阵 207 / 438 Problem B HDU 1754 I Hate It ...
- java selenium 项目环境搭建(一)
1.使用jdk1.7版本.jdk下载,请再百度输入 jdk 1.7下载,环境配置参考
- Node.js发送邮件
1.使用nodemailer模块 var nodemailer = require("nodemailer"); 2.代码如下 exports.send_email = funct ...
- 《Code Complete》ch.25 代码调整策略
WHAT? 本章讨论程序性能调整问题.但是对用户来说,程序员按时交付软件,提供一个清爽的用户界面,避免系统经常死机常常比程序性能更加重要 WHY? 在程序设计这种文化中,编写出能够节省几微秒的代码可以 ...