轻量级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配套你的软件架构,那 ...
随机推荐
- Matlab.NET混合编程技巧之——直接调用Matlab内置函数(附源码)
原文:[原创]Matlab.NET混合编程技巧之--直接调用Matlab内置函数(附源码) 在我的上一篇文章[原创]Matlab.NET混编技巧之——找出Matlab内置函数中,已经大概的介绍了mat ...
- hdu 4915 Parenthese sequence 多校第五场
推断一个序列是否是有效是简单的. 可是推断序列是不是有多个解会出问题. 那么从i=0 ~l 假设读到问号,推断该问号成为(能否有效,该问号为)是否有效. 假设都有效,则必有多个解. 假设都无效,则无解 ...
- 【Android】九宫格实现
第一步,布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...
- HTML5实现刮奖效果
原文:HTML5实现刮奖效果 要实现刮奖效果,最重要的是要找到一种方法:当刮开上层的涂层是就能看到下层的结果.而HTML5的canvas API中有一个属性globalCompositeOperati ...
- (一)AngularJS获取贴纸Hello World
一旦项目使用JQuery原创javascript,最近参加了一个项目,需要使用AngularJS.RequireJS比较框架,如汰渍. 这里写一些博客,记录自己的学习过程,虽然冠以原来的名字,资料,加 ...
- HTTPS那个东西(一)-HTTPS原理
HTTPS那个东西(一) 最近看了<http权威指南>几个章节,对HTTPS随着节,了一些资料,遂打算记录一下心得.写的仓促,肯定有非常多错误的地方,欢迎大家指正. 1.HTTP是什么 那 ...
- 移植X264成功
http://blog.csdn.net/mashang123456789/article/details/8673426 http://blog.csdn.net/b5w2p0/article/de ...
- mac_开启ftp并访问
[启动&关闭] mac下一般用smb服务来进行远程文件访问,但要用FTP的话,高版本的mac os默认关掉了,可以用如下命令打开: sudo -s launchctl load -w /Sys ...
- C# 跨线程呼叫控制
在C# 应用程序开发, 我们经常要UI作线程分开,防止界面停止响应. 同一时候我们又须要在工作线程中更新UI界面上的控件, 以下介绍几种经常使用的方法 阅读文件夹 线程间操作无效 第一种办法:禁止编 ...
- Mysql sql声明召回2 --正则表达式
这里简单回顾mysql在过滤后的数据使用正则表达式时.主要利用每方法将样品,或添加一些简短的说明. 下面说说提前,使用正则表达式是用来过滤数据 REGEXPkeyword 基本字符相匹配: SELEC ...