轻量级IOC框架:Ninject
Ninject 学习杂记 - liucy
IOC容器的DI实现并不依赖于方法调用拦截,而是通过DI容器内部自己通过反射的方式生成需要的类型实例,并调用实例的成员。然后再把实例返回给容器外部环境使用。
Ninject本身及其扩展库,还针对特定的开发平台或项目类型提供了专用的DI支持,比如针对WPF/SL,针对ASP.NET MVC
Ninject 的扩展库 也是基于Ninject核心库的,对于某些特定场景的功能补充
StandardKernel 是Ninject中的IOC容器类,Get方法是显式的得到某类型的实例, Bind方法是类型映射注册,注册以后,Ninject就可以根据程序的需要来提供实例创建。
using (var kernel = new Ninject.StandardKernel())
{
var service = kernel.Get<SalutationService>();
kernel.Bind<ILog>().To<ConsoleLog>();
service.SayHello();
}
如果没有特别指定由Ninject创建的类型实例的生命周期,那么就是默认的每次都由Ninject提供一个新的类型实例,Ninject不负责管理它的lifecycle
Kernel.Bind<Ilogger>().To<ConsoleLogger>().InSingletonScope(); 来显式的指定实例是以单例形式存在,每次Ninject都只提供已经存在的类型实例,而不是重新构建新的。
.InThreadScope() 对同一线程提供同一实例
.InRequestScope() 针对同一Web request 提供同一实例。
.InScope(func) 可以由开发者自己定义Scope, 直到func 返回的值发生了变化,才重新构建新的实例。
Kernel.Bind<MailService>().ToSelf() 是把某类型自己映射到自己。
Ninject Module: Module 是作为Ninject中对 类型绑定映射进行分组管理的单元。
public class LoggerModule : NinjectModule
{
public override void Load()
{
Bind<ILog>().To<ConsoleLog>().InSingletonScope();
}
}
static void Main(string[] args)
{
using (var kernel = new Ninject.StandardKernel(new LoggerModule()))
{
var logger = kernel.Get<ILog>();
logger.Log("wow");
}
}
We can also load all of the Ninject modules defned in an application at the same
time using the following code:
kernel.Load(AppDomain.CurrentDomain.GetAssemblies());
Ninject 还允许通过XML配置文件形式来定义类型绑定映射, 之后就可以通过Kernel.Load("Config.xml") 的形式读取配置信息,并完成映射注册
Ninject通过NinjectModule来配置依赖注入(不知道有没有文件配置,在官方教程里没找到相关资料),这里自定义自己的Module:
internal class MyModule : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<ILogger>().To<FlatFileLogger>();
Bind<ILogger>().To<DatabaseLogger>();
}
}
具体调用方法:
private static IKernel kernel = new StandardKernel(new MyModule());
static void Main(string[] args)
{
ILogger logger = kernel.Get<ILogger>();
logger.Write("Bruce Say: Hello Ninject!");
Console.WriteLine("continues..");
Console.Read();
}
通过 kernel.Get<ILogger>() 来获取ILogger的实例,之前在MyModule里先后对ILogger 绑定了FlatFileLogger 和 DatabaseLogger,而kernel.Get<ILogger>() 这里返回第一个绑定的对象,即FlatFileLogger。
构造函数注入
这里新建一个ITester 和 IocTester, 而IocTester 依赖于ILogger:
interface ITester
{
void Test();
}
class IocTester:ITester
{
private ILogger _logger;
public IocTester(ILogger logger)
{
_logger = logger;
}
public void Test()
{
_logger.Write("Bruce Say: Hello Ninject!");
}
}
下面看看Ninject是怎么配置的,很简单修改MyModule,绑定ITester:Bind<ITester>().To<IocTester>():
internal class MyModule : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<ILogger>().To<FlatFileLogger>();
Bind<ITester>().To<IocTester>();
}
}
从以上配置中,我们是看不到IocTester 和ILogger 是有依赖关系的,这就是依赖注入的好处。只是简单告诉哪个接口对应哪个类,剩下的任务就可以交给Ninject来处理了。
private static IKernel kernel = new StandardKernel(new MyModule());
static void Main(string[] args)
{
ITester tester = kernel.Get<ITester>();
tester.Test();
Console.WriteLine("continues..");
Console.Read();
}
原创文字只代表本人某一时间内的观点或结论,本人不对涉及到的任何代码担保。转载请标明出处!
轻量级IOC框架:Ninject的更多相关文章
- 轻量级IoC框架Ninject.NET搭建
说在之前的话 IOC的概念相信大家比较熟悉了,习惯性称之为依赖注入或控制反转,园子里对基于MVC平台IOC设计模式已经相当多了,但大家都只知道应该怎么应用一个IOC模式,比如Ninject, Unit ...
- IOC框架Ninject实践总结
原文地址:http://www.cnblogs.com/jeffwongishandsome/archive/2012/04/15/2450462.html IOC框架Ninject实践总结 一.控制 ...
- 轻量级IOC框架Guice
java轻量级IOC框架Guice Guice是由Google大牛Bob lee开发的一款绝对轻量级的java IoC容器.其优势在于: 速度快,号称比spring快100倍. 无外部配置(如需要使用 ...
- 轻量级IOC框架:Ninject (上)
前言 前段时间看Mvc最佳实践时,认识了一个轻量级的IOC框架:Ninject.通过google搜索发现它是一个开源项目,最新源代码地址是:http://github.com/enkari/ninje ...
- java轻量级IOC框架Guice(转)
出处:http://www.cnblogs.com/whitewolf/p/4185908.html Guice是由Google大牛Bob lee开发的一款绝对轻量级的java IoC容器.其优势在于 ...
- 轻量级IOC框架:Ninject (下)
一,创建依赖链(Chains of Dependency) 当我们向Ninject请求创建一个类型时,Ninject会去检查该类型和其他类型之间的耦合关系.如果有额外的依赖,Ninject也会解析它们 ...
- java轻量级IOC框架Guice
Google-Guice入门介绍(较为清晰的说明了流程):http://blog.csdn.net/derekjiang/article/details/7231490 使用Guice,需要添加第三方 ...
- 轻量级IOC框架SwiftSuspenders
该框架的1.6版本位于https://github.com/tschneidereit/SwiftSuspenders/blob/the-past/,现在已经出了重新架构的2.0版本,所以我决定先研究 ...
- 轻量级IOC容器:Ninject
Ninject是一个快如闪电.超轻量级的基于.Net平台的依赖注入框架.它能够帮助你把应用程序分离成一个个松耦合.高内聚的模块,然后用一种灵活的方式组装起来.通过使用Ninject配套你的软件架构,那 ...
随机推荐
- 安装 CentOS 7 后必做的七件事
原文 安装 CentOS 7 后必做的七件事 CentOS 是最多人用来运行服务器的 Linux 版本,最新版本是 CentOS 7.当你兴趣勃勃地在一台主机或 VPS 上安装 CentOS 7 后, ...
- express: command not found.
npm install -g express 可是不行.全局模式不行. With the release of Express 4.0.0 it looks like you need to do s ...
- MOCK.JS 生成随机数据,拦截 Ajax 请求
mock.js 的用处 前后端分离 :让前端攻城师独立于后端进行开发. 增加单元测试的真实性 :通过随机数据,模拟各种场景. 开发无侵入 :不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响 ...
- ubuntu12.04下一个samba、tftp、nfs构造
1.samba setting 1>apt-get install samba apt-get install smbfs 2>mkdir /home/linux/shar ...
- mysql_常用命令
1: 以指定编码创建数据库 CREATE DATABASE `search_data` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
- sgu 194 被动散热器具有最大流量的上限和下限(最大流量模板dinic加上优化)
模板类型的题详细參考国家集训队论文:http://wenku.baidu.com/view/0f3b691c59eef8c75fbfb35c.html 參考博客:http://blog.csdn.ne ...
- Windows平台配置Appium+Java环境
1) 安装JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 安装 ...
- 【百度地图API】如何制作班级地理通讯录?LBS通讯录
原文:[百度地图API]如何制作班级地理通讯录?LBS通讯录 摘要:班级通讯录必备的功能,比如人员列表,人员地理位置标注,展示复杂信息窗口,公交和驾车等.一般班级人员都不会超过300个,因为可以高效地 ...
- 教你一步一步部署.net免费空间OpenShift系列之四------绑定域名、使用CDN加速
很抱歉这几天没有时间,有人问我怎么绑定域名的问题也没有答复,下面进入正题,惊闻ASP.Net要开源了,难道.Net春天要来了?不废话,上回书说,部署完毕ASP.Net网站后,直接访问不能访问(嗯,众所 ...
- ftk学习记录(IME文章)
[声明:版权全部,欢迎转载.请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前面说的是全屏设置,还是请大家看一下效果图. watermark/2/text/aHR0cDovL ...