Ninject 3 学习笔记 一.为什么使用Ninject?
2014-08-16 22:30
239 查看
最近在使用IoC进行一个较复杂的项目进行架构,在IoC的选择上让我很是纠结。首先我不喜欢大量的配置文件进行配置,那简直是噩梦,比学习一门编程语言还痛苦。我喜欢前一段时间看EF的CodeFirst的那种模式,一切尽在代码控制;其次要轻,框架里面的大多数功能我能用上多少呢?甚至于可能你永远都不会知道。尝试过自己实现了简单的IoC功能,也的确在很多项目用到了,但是对于自己的能力还是有所了解的,更希望还是能找到一个轻量,功能够用,易于使用的。查了很久,无意间,看到MVC4中有提到了这个框架:Ninject。留意,看了不少介绍,好象是我想要的。
网上的资料很少,太简单。上官网看,全英文,慢慢看吧,同时简单的翻译一部份有用的,放在这里,算翻译么?也不算,也算是原创吧,必竟有大量自己的理解。
错误肯定有,可能也会摘一些其他文章中的部份文字,如果不同意,告诉我,我删除掉就是了。好了,开始吧。
如果想让程序脱离耦合,就必须使用IoC容器来解决这个问题。Ninject就是这样一个容器。
Ninject不是第一个IoC容器,也一定不会是最后一个,那么Ninject的设计初衷是什么呢?
首先,其他框架过于依赖配置文件。这至少有下述的一些缺点:
配置更为复杂和冗长的;你需要提供assembly-qualified名称来进行定义,这很容易破坏你的应用程序而仅仅是因为一个简单的打字错误。相比之下,Ninject默认的做法是通过接口来进行类型绑定。
例如:你想将 ServiceImpl 的实现进行它所属的接口 IService:
[csharp]
view plaincopyprint?
Bind<IService>().To<ServiceImpl>();
其次,许多其他的框架太过重量,这将意味着你的项目需要添加一些非常多的组件引用,或依赖于各种框架组件。对于较小的项目,这可能会导致“膨胀”。ninject旨在让事情简单明了。
第三,Ninject 推出一个概念的定义:上下文绑定(Contextual Binding)。它将不是基于字符串标识的绑定,Ninject可以运行期间灵活的进行条件化的绑定,例如:
[csharp]
view plaincopyprint?
Bind<IService>().To<RedImpl>().WhenTargetHas<RedAttribute>();
Bind<IService>().To<BlueImpl>().WhenTargetHas<BlueAttribute>();
class ConsumerA
{
public ConsumerA([Red] IService service)
{
//因为加上了"Red"定制特性,通过方法注入"IService"的实现将是RedImpl
}
}
class ConsumerB
{
public ConsumerB([Blue] IService service)
{
//因为加上了"Blue"定制特性,通过方法注入"IService"的实现将是BlueImpl
}
}
Ninject 的重要特点:重量轻,高度模块化框架
有一些 Ninject 自已总结的特点,我认为很重要:
紧凑
高度一致
测试驱动开发,并且最大化的单元测试覆盖率
当说明文档看不明白时,大量的测试代码就是最好的例子
Ninject 支持 Silverlight, Mono, WP7.5,.NET 4.0, MVC3, 以及 WinRT的预览支持。
重要的还包括,Ninject 的扩展已经非常多了:
ninject.web.mvc
ninject.extensions.interception
ninject.extensions.wcf
ninject.extensions.logging
ninject.extensions.conventions
ninject.extensions.xml
ninject.extensions.messagebroker
ninject.extensions.weakeventmessagebroker
ninject.moq
and more…
Ninject.Web.Common :用于Web扩展和WCF的扩展。
Ninject.Web.Mvc: 用于ASP.NET MVC。
Ninject.Web :用于ASP.NET WebForm。
Ninject.Extensions.Wcf :支持WCF。
Ninject.Extensions.Conventions: 提供配置,用于修改Ninject的默认约定。
Ninject.Extensions.Factory: 用于自动创建工厂和实例对象。
Ninject.Extensions.Interception: 用于拦截。
Ninject.Extensions.NamedScope :允许绑定定义范围.
Ninject.Extensions.ContextPreservation: 用于上下文的保存。 经常和NameScope结合起来一起用。
Ninject.Extensions.ChildKernel:为Ninject提供内核定义。
Ninject.Extensions.DependencyCreation:
Ninject.Web.Mvc.FluentValidation:用于MVC Fluent Api的验证。
Ninject.Extensions.Logging: 日志记录。
Ninject.Extensions.bbvEventBroker:
Ninject.Extensions.WeakEventMessageBroker:
Ninject.Extensions.MessageBroker:消息代理。
Ninject.Extensions.Xml: 基于XML的模块加载Ninject。
Ninject.MockingKernel: 用于模拟。
Ninject.Extensions.WF:用于支持工作流。
原文:http://blog.csdn.net/simpkan/article/details/8169740
网上的资料很少,太简单。上官网看,全英文,慢慢看吧,同时简单的翻译一部份有用的,放在这里,算翻译么?也不算,也算是原创吧,必竟有大量自己的理解。
错误肯定有,可能也会摘一些其他文章中的部份文字,如果不同意,告诉我,我删除掉就是了。好了,开始吧。
如果想让程序脱离耦合,就必须使用IoC容器来解决这个问题。Ninject就是这样一个容器。
Ninject不是第一个IoC容器,也一定不会是最后一个,那么Ninject的设计初衷是什么呢?
首先,其他框架过于依赖配置文件。这至少有下述的一些缺点:
配置更为复杂和冗长的;你需要提供assembly-qualified名称来进行定义,这很容易破坏你的应用程序而仅仅是因为一个简单的打字错误。相比之下,Ninject默认的做法是通过接口来进行类型绑定。
例如:你想将 ServiceImpl 的实现进行它所属的接口 IService:
[csharp]
view plaincopyprint?
Bind<IService>().To<ServiceImpl>();
其次,许多其他的框架太过重量,这将意味着你的项目需要添加一些非常多的组件引用,或依赖于各种框架组件。对于较小的项目,这可能会导致“膨胀”。ninject旨在让事情简单明了。
第三,Ninject 推出一个概念的定义:上下文绑定(Contextual Binding)。它将不是基于字符串标识的绑定,Ninject可以运行期间灵活的进行条件化的绑定,例如:
[csharp]
view plaincopyprint?
Bind<IService>().To<RedImpl>().WhenTargetHas<RedAttribute>();
Bind<IService>().To<BlueImpl>().WhenTargetHas<BlueAttribute>();
class ConsumerA
{
public ConsumerA([Red] IService service)
{
//因为加上了"Red"定制特性,通过方法注入"IService"的实现将是RedImpl
}
}
class ConsumerB
{
public ConsumerB([Blue] IService service)
{
//因为加上了"Blue"定制特性,通过方法注入"IService"的实现将是BlueImpl
}
}
Ninject 的重要特点:重量轻,高度模块化框架
有一些 Ninject 自已总结的特点,我认为很重要:
紧凑
高度一致
测试驱动开发,并且最大化的单元测试覆盖率
当说明文档看不明白时,大量的测试代码就是最好的例子
Ninject 支持 Silverlight, Mono, WP7.5,.NET 4.0, MVC3, 以及 WinRT的预览支持。
重要的还包括,Ninject 的扩展已经非常多了:
ninject.web.mvc
ninject.extensions.interception
ninject.extensions.wcf
ninject.extensions.logging
ninject.extensions.conventions
ninject.extensions.xml
ninject.extensions.messagebroker
ninject.extensions.weakeventmessagebroker
ninject.moq
and more…
Ninject.Web.Common :用于Web扩展和WCF的扩展。
Ninject.Web.Mvc: 用于ASP.NET MVC。
Ninject.Web :用于ASP.NET WebForm。
Ninject.Extensions.Wcf :支持WCF。
Ninject.Extensions.Conventions: 提供配置,用于修改Ninject的默认约定。
Ninject.Extensions.Factory: 用于自动创建工厂和实例对象。
Ninject.Extensions.Interception: 用于拦截。
Ninject.Extensions.NamedScope :允许绑定定义范围.
Ninject.Extensions.ContextPreservation: 用于上下文的保存。 经常和NameScope结合起来一起用。
Ninject.Extensions.ChildKernel:为Ninject提供内核定义。
Ninject.Extensions.DependencyCreation:
Ninject.Web.Mvc.FluentValidation:用于MVC Fluent Api的验证。
Ninject.Extensions.Logging: 日志记录。
Ninject.Extensions.bbvEventBroker:
Ninject.Extensions.WeakEventMessageBroker:
Ninject.Extensions.MessageBroker:消息代理。
Ninject.Extensions.Xml: 基于XML的模块加载Ninject。
Ninject.MockingKernel: 用于模拟。
Ninject.Extensions.WF:用于支持工作流。
原文:http://blog.csdn.net/simpkan/article/details/8169740
相关文章推荐
- Ninject 3 学习笔记 一.为什么使用Ninject?
- 【ASP.NET MVC 学习笔记】- 06 在MVC中使用Ninject
- java泛型编程学习 笔记一:为什么要使用泛型
- Android(java)学习笔记226:服务(service)之为什么使用服务
- Java学习笔记(十三):为什么要使用单例模式
- elasticsearch学习笔记之一(为什么要使用elasticsearch)
- 学习笔记--post 相比get 有很多优点,为什么现在的HTTP通信中大多数请求还是使用get?
- Python学习笔记--为什么需要使用__name__=='__main__'
- SVN学习笔记1 -- 为什么要使用SVN
- 【原创】Asp.net MVC 学习笔记之-为什么使用Html.TextBox方法会出现异常?
- 学习笔记之引用的使用
- C# 学习笔记 -- 第三天 申明和使用数据
- C#中使用委托的学习笔记
- Chap 4 学习笔记-使用C#存储变量数据
- (学习笔记)使用sqlcommand执行存储过程!
- C#学习笔记(二十一):使用文件基础
- 学习笔记,VB.NET使用DirectSound9 (1) 简单播放
- .Net学习笔记 - Web页中使用WinForm
- C#学习笔记(十六):使用打开保存文件对话框
- JbuilderX使用Junit学习笔记