• Ninject.Extensions.


    最近在使用IoC进行一个较复杂的项目进行架构,在IoC的选择上让我很是纠结。首先我不喜欢大量的配置文件进行配置,那简直是噩梦,比学习一门编程语言还痛苦。我喜欢前一段时间看EF的CodeFirst的那种模式,一切尽在代码控制;其次要轻,框架里面的大多数功能我能用上多少呢?甚至于可能你永远都不会知道。尝试过自己实现了简单的IoC功能,也的确在很多项目用到了,但是对于自己的能力还是有所了解的,更希望还是能找到一个轻量,功能够用,易于使用的。查了很久,无意间,看到MVC4中有提到了这个框架:Ninject。留意,看了不少介绍,好象是我想要的。

    网上的资料很少,太简单。上官网看,全英文,慢慢看吧,同时简单的翻译一部份有用的,放在这里,算翻译么?也不算,也算是原创吧,必竟有大量自己的理解。

    错误肯定有,可能也会摘一些其他文章中的部份文字,如果不同意,告诉我,我删除掉就是了。好了,开始吧。


    如果想让程序脱离耦合,就必须使用IoC容器来解决这个问题。Ninject就是这样一个容器。

    Ninject不是第一个IoC容器,也一定不会是最后一个,那么Ninject的设计初衷是什么呢?

    首先,其他框架过于依赖配置文件。这至少有下述的一些缺点:

    配置更为复杂和冗长的;你需要提供assembly-qualified名称来进行定义,这很容易破坏你的应用程序而仅仅是因为一个简单的打字错误。相比之下,Ninject默认的做法是通过接口来进行类型绑定。

    例如:你想将 ServiceImpl 的实现进行它所属的接口 IService:

    [csharp] view plaincopyprint?
     
    1. Bind<IService>().To<ServiceImpl>();  

    其次,许多其他的框架太过重量,这将意味着你的项目需要添加一些非常多的组件引用,或依赖于各种框架组件。对于较小的项目,这可能会导致“膨胀”。ninject旨在让事情简单明了。

    第三,Ninject 推出一个概念的定义:上下文绑定(Contextual Binding)。它将不是基于字符串标识的绑定,Ninject可以运行期间灵活的进行条件化的绑定,例如:

    [csharp] view plaincopyprint?
     
    1. Bind<IService>().To<RedImpl>().WhenTargetHas<RedAttribute>();  
    2. Bind<IService>().To<BlueImpl>().WhenTargetHas<BlueAttribute>();  
    3. class ConsumerA   
    4. {  
    5.     public ConsumerA([Red] IService service)  
    6.     {  
    7.         //因为加上了"Red"定制特性,通过方法注入"IService"的实现将是RedImpl  
    8.     }  
    9. }  
    10. class ConsumerB  
    11. {  
    12.     public ConsumerB([Blue] IService service)  
    13.     {  
    14.         //因为加上了"Blue"定制特性,通过方法注入"IService"的实现将是BlueImpl  
    15.     }  
    16. }  

    Ninject 的重要特点:重量轻,高度模块化框架

    有一些 Ninject 自已总结的特点,我认为很重要:

    1. 紧凑
    2. 高度一致
    3. 测试驱动开发,并且最大化的单元测试覆盖率
    4. 当说明文档看不明白时,大量的测试代码就是最好的例子

    Ninject 支持 Silverlight, Mono, WP7.5,.NET 4.0, MVC3, 以及 WinRT的预览支持。

    重要的还包括,Ninject 的扩展已经非常多了:

    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:用于支持工作流。
  • 相关阅读:
    Two Sum II
    Subarray Sum
    Intersection of Two Arrays
    Reorder List
    Convert Sorted List to Binary Search Tree
    Remove Duplicates from Sorted List II
    Partition List
    Linked List Cycle II
    Sort List
    struts2结果跳转和参数获取
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4156587.html
Copyright © 2020-2023  润新知