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. Bugtags:移动时代首选 Bug 管理系统

    Bug 管理系统之重 回想我们每次开启一个新项目,筹备之初,首要之事就是选择一款 Bug 管理系统.市面上有诸多 Bug 管理系统可供选择:Jira.Redmine.Bugzilla 等.这些系统功能 ...

  2. 将access数据库导入mysql

    一般地,直接在mysql端,导入时选择access文件就行:但是若access数据库版本太老,导入mysql时会出错: 这时,就需要借助access 2003,对原始数据进行转换为2003版本数据,即 ...

  3. HTTP权威指南一

    HTTP——因 特网的多媒体信使 每天, 都有数以亿万计的 JPEG 图片. HTML 页面. 文本文件. MPEG 电影. WAV音频文件. Java 小程序和其他资源在因 特网 上游弋. HTTP ...

  4. Mingyang.net:自定义FreeMarkerView

    自定义FreeMarkerView的目的是为了放一些公共的变量到FreeMarker模版里面.spring-context.xml: <!-- ************************* ...

  5. 使用jaxp对比xml进行DOM解析

    /*DOM解析编程 •遍历所有节点 •查找某一个节点 •删除结点 •更新结点 •添加节点 /* package cn.itcast.jaxp; import java.io.File; import ...

  6. (转)将access数据库迁移到SQLserver的两种方法

    在实际项目使用中遇到的问题,将原文整理后以备后用. 原文地址(具体链接几次未知):http://www.jb51.net/article/41956.htm 方法1 使用ACCESS2007自带的数据 ...

  7. A+B问题通解_Pascal_C++_Java

    世界不断发展,各种电子设备不断变得更加迷你,代码却越写越长…… A+B Problem Input:Two integer A,B Output:The ans of A+B 1971年,Niklau ...

  8. 慕课网-安卓工程师初养成-4-6 Java条件语句之 switch

    来源:http://www.imooc.com/code/1358 当需要对选项进行等值判断时,使用 switch 语句更加简洁明了.例如:根据考试的名次,给予前 4 名不同的奖品.第一名,奖励笔记本 ...

  9. 自定义模板语言之simple_tag和自定义过滤器

    扩展你的模板系统 一般是扩展模板的tag和filter两个功能.可以用来创建你自己的tag和filter功能库. 创建模板库 分为两步: 1. 首先决定由模板库在哪一个注册的app下放置,你可以放在一 ...

  10. org.apache.ibatis.reflection.ReflectionException

    org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.Reflecti ...