zoukankan      html  css  js  c++  java
  • 大话DI依赖注入+IOC控制反转(二) 之 浅析.Net Core中的DI与IOC

            转发时请注明原创作者及地址,否则追究责任。原创:alunchen

      在上一篇文章中,我们聊了很多关于定义的方面,比较孤燥,下面我们结合.Net Core聊一下依赖注入&控制反转。

    三种对象生命周期

          关于.Net Core中的容器,有三种对象的生命周期,这个从网上搜索也有大堆的资料。为了循序渐进,我们这里介绍一下。

    Transient

          称为短暂,意思是需要使用时就创建一个新的对象。从容易层面讲,当从容器取出时,都创建一个新的对象。这种是最常用的,因为我们一般使用对象都直接创建。

    Scope

          称为范围使用,在ASP.Net Core中,Scope就是在一次API请求中,都是同一个对象。最经典的要数EF框架中,添加Context是用Scope类型。即在一次请求中,创建一个DB连接,请求完毕断开连接。

    更深一层说,在子容器中,scope都是同一个对象;根容器中,scope全部都是同一个对象,等同于单例。

    Singleton

          称为单例模式,此模式也是常用。一般需要创建全局的单例,如数据库连接类、配置类、公共类等。此类型在一个应用中,永远都只有一个对象,所以要注意线程的问题。

     

    大话.Net Core

         在.Net Core中,原生的依赖注入框架是Microsoft.Extensions.DependencyInjection。

          在此框架中,容器类是集成于接口IServiceCollection的ServiceCollection。简单地理解此类是一个集合,装载了所有对象。还有一个常用的是ServiceProvider,此类是提供从容器ServiceCollection获取集合的操作。

    简单的依赖注入                             

    下面,我们在控制台应用中简单地使用一下依赖注入。

          首先创建两个实体,一个电话Phone,一个电话筒Microphone。电话筒是作为电话的一个属性。

    clipboard_看图王

         

          然后,我们创建容器并且从容器中获取对象。

    clipboard1_看图王

          从上面,我们可以打印到Phone的信息,并且也能打印Microphone的信息。因为我们把两个对象都放入到了容器集合中。

          在上面的例子中,Microphone是作为构造参数,被依赖于Phone中。这种注入,称为构造器注入。而且在.Net Core中,只有这种依赖方式。还有其它的依赖方式,如方法注入、属性注入。

          那么,为什么在.Net Core中只有构造器注入呢?因为在所有注入方式来说,构造器注入是最正宗的注入。好处在于:保证依赖不可变、保证依赖不可空、避免了循环依赖、提升了代码的可复用性。

          并不是说构造器注入是万金油,也有些情况需要用属性注入等方式。所以,后面的注入方式.Net Core迟早要加入。

    构造器注入选择                                   

          在.Net Core中,构造器注入的选择都是选择最多参数的,并且此参数都属于容器中。

          要证明上面的观点,我们做下面最经典的例子来说明。

    创建3个类,分别为A、B、C。C类依赖与A与B,如下:

    clipboard_看图2王

    初始化容器,并取出C类。

    clipboard_看22图王

          我们可以看到控制台打印:【in a b】。

          所以,验证了上面的观点。使用构造注入时,使用构造参数最多,并且参数都属于容器中的构造器。

    总结

          上面浅析了DI与IOC在.Net Core中的应用。介绍了三种不同的生命周期与场景,使用构造器注入时.Net Core的选择。

    可以关注本人的公众号,多年经验的原创文章共享给大家。

       

  • 相关阅读:
    编写高效的C#图像处理程序(3) Rgb=>Lab,图像缺陷检测的例子
    使用MvcContrib的FormHelper
    XNA游戏开发
    Microsoft.Web.Mvc Assembly 说明
    NVelocity View Engine with Asp.net Mvc
    Asp.net Mvc Framework可以在Controller中使用的Url.Action方法
    校内网API的.net版本XiaoNei.Net 1.0(非官方)
    Asp.net Mvc Framework在.net 2.0/IIS6下运行,程序示例
    CHSNS#发布V1.21版
    Asp.net Mvc Codeplex Preview 5 第一篇 Helper的新特性
  • 原文地址:https://www.cnblogs.com/alunchen/p/9909406.html
Copyright © 2011-2022 走看看