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依赖注入——构造函数的注入的更多相关文章

  1. Ninject依赖注入——构造函数、属性、方法和字段的注入

    Ninject依赖注入——构造函数.属性.方法和字段的注入(三) 1.Ninject简介 Ninject是基于.Net平台的依赖注入框架,它能够将应用程序分离成一个个高内聚.低耦合(loosely-c ...

  2. Ninject之旅之七:Ninject依赖注入

    摘要 可以使用不同的模式向消费者类注入依赖项,向构造器里注入依赖项是其中一种.有一些遵循的模式用来注册依赖项,同时有一些需要避免的模式,因为他们经常导致不合乎需要的结果.这篇文章讲述那些跟Ninjec ...

  3. 在MVC5中使用Ninject 依赖注入

    各大主流.Net的IOC框架性能测试比较 : http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html 使用NuGet ...

  4. WebApi中使用Ninject 依赖注入

    之前Ninject依赖注入是在MVC中使用,最近在WebApi中使用,用之前的MVC方式发现使用接口注入,一直是Null错误,网上查询了一些资源,总结一下,以后备用. 主要分为以下几步骤: 在NuGe ...

  5. ASP.NET Core 依赖注入(构造函数注入,属性注入等)

    原文:ASP.NET Core 依赖注入(构造函数注入,属性注入等) 如果你不熟悉ASP.NET Core依赖注入,先阅读文章: 在ASP.NET Core中使用依赖注入   构造函数注入 构造函数注 ...

  6. IOC 构造函数注入vs属性注入

    1.不管是构造函数注入还是属性注入,都要先把对象给new 出来,构造函数应该也是public.2.一般使用 配置文件,属性注入,不用使用特性,直接配置,初始化或依赖,凡是注入的,都要有访问权限,pub ...

  7. Spring 依赖注入中 Field 注入的有害性

    大致分为:Field 注入.构造注入.setter 注入 其中 Field 注入被认为有害的: 1. 违反了单一原则 当一个 class 中有多个依赖时,如果仅仅使用 Field 注入,则看不出有很多 ...

  8. Spring 依赖注入(基本注入和自动适配注入)

    Spring 依赖注入 Spring框架的核心功能之一就是通过依赖注入的方式来管理Bean之间的依赖关系. 属性注入 构造注入 内部注入 自动装配 1.属性注入 IService: public in ...

  9. Spring学习笔记1—依赖注入(构造器注入、set注入和注解注入)

    什么是依赖注入 在以前的java开发中,某个类中需要依赖其它类的方法时,通常是new一个依赖类再调用类实例的方法,这种方法耦合度太高并且不容易测试,spring提出了依赖注入的思想,即依赖类不由程序员 ...

随机推荐

  1. vim操作笔记

    1.切换到下一个文件 假设要切换的文件名为 test.py :ex test.py 2.文档内复制命令 yy "复制光标所在行.或大写一个Y. 2yy "复制两行. y^ &quo ...

  2. FOOD

    Serving order of food courses(上菜顺序)1. Appetizer(starter)2. Main Course3. Dessert Style of cooking1. ...

  3. 基于spring-redis发布订阅模式的实现

    redis配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http ...

  4. [Java] 通过文件流拷贝文件

    package test.stream; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja ...

  5. 【转】Python处理HTML转义字符

    Python处理HTML转义字符 转 [http://www.cnblogs.com/xuxn/archive/2011/08/12/parse-html-escape-characters-in-p ...

  6. 使用 Heka 导入自定义的nginx日志到Elasticsearch

    重置Heka执行进度 heka的进度配置文件存在配置项 base_dir 设置的目录,只需要删除这个文件夹下面的内容,就可以完全重置heka的进度. base_dir 配置项默认是在下面目录: '/v ...

  7. [kuangbin带你飞]专题七 线段树

            ID Origin Title 228 / 440 Problem A HDU 1166 敌兵布阵   207 / 438 Problem B HDU 1754 I Hate It   ...

  8. java selenium 项目环境搭建(一)

    1.使用jdk1.7版本.jdk下载,请再百度输入 jdk 1.7下载,环境配置参考

  9. Node.js发送邮件

    1.使用nodemailer模块 var nodemailer = require("nodemailer"); 2.代码如下 exports.send_email = funct ...

  10. 《Code Complete》ch.25 代码调整策略

    WHAT? 本章讨论程序性能调整问题.但是对用户来说,程序员按时交付软件,提供一个清爽的用户界面,避免系统经常死机常常比程序性能更加重要 WHY? 在程序设计这种文化中,编写出能够节省几微秒的代码可以 ...