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提出了依赖注入的思想,即依赖类不由程序员 ...
随机推荐
- 使用Topshelf 5步创建Windows 服务 z
使用Topshelf创建Windows 服务简要的介绍了创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with T ...
- by which, in which, from which 语法区别
(1)Here is Beijing,where I grow up.where其实也是指代北京,不过where是在北京的意思,也就是 in Beijing (2)Here is Beijing,in ...
- linux内核神级list
源码: #ifndef _LINUX_LIST_H #define _LINUX_LIST_H /* * Simple doubly linked list implementation. * * S ...
- setinterval在jQuery里面是怎么使用的。
自动播放?不太明白你的意思啊,自动播放什么呢? 首先jquery选择器获取需要自动播放的元素,然后执行播放动作 例如:window.onload=function(){$("#player& ...
- nyoj 97 兄弟郊游问题
点击打开链接 兄弟郊游问题 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 兄弟俩骑车郊游,弟弟先出发,每分钟X米,M分钟后,哥哥带一条狗出发.以每分钟Y米的速度去追弟弟 ...
- cocos2dx 锁定30帧设置
修改代码: AppDelegate.cpp // set FPS. the default value is 1.0/60 if you don't call this pDirector->s ...
- 使用Spring的Property文件存储测试数据 - 添加测试数据
测试数据直接写在Property文件中,如下图: application.properties是系统自动生成,我添加了两个Property文件:HomeTestData.properties和moto ...
- Centos7 Openstack - (第一节)基本环境配置
Centos7 install Openstack - (第一节)基本环境配置 我的blog地址:http://www.cnblogs.com/caoguo 根据openstack官方文档配置 官方文 ...
- 对.Net系统架构改造的一点经验和教训
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 在互联网行业,基于Unix/Linux的网站系统架构毫无疑问是当今主流的架构解决方案 ...
- C#中的委托,匿名方法和Lambda表达式
简介 在.NET中,委托,匿名方法和Lambda表达式很容易发生混淆.我想下面的代码能证实这点.下面哪一个First会被编译?哪一个会返回我们需要的结果?即Customer.ID=.答案是6个Firs ...