专栏首页前端侠2.0asp。net5的依赖注入 原

asp。net5的依赖注入 原

昨天读asp.net5的doc,看到了configure的配置时,提到在controller中访问配置就是通过依赖注入的。asp.net5的很多功能都通过依赖注入来实现了,可以看一下startup.cs中,有多少给出的是接口吧!这个概念我也知道很久了,如何实现一直未搞清,而且在.net环境下,也有几个成熟的方案,但因为不是.net框架的一部分,所以我从未上手使用过,对这一块一直是模模糊糊。即然想用asp.net5作为自己下一步的开发环境,还是啃一下子吧!

就概念上说,依赖注入就是解决强耦合问题的。以前写代码用到 .net的框架以及第三方库,都是提供好一个个的类,然后我们就是实例化这个类,调用它的各个方法来写程序。这样有问题吗?没问题,我喜欢。 但有人却不喜欢,非要“注入”一下。于是“接口” 、构造函数注入 、属性注入就产生了。

先看一下如何基于asp.net5的依赖注入写代码吧,其它框架的注入应该还有不同的,就不管它了。

首先在startup.cs中,

        public void ConfigureServices(IServiceCollection services)
        {
            //根据asp.net的文档,这样添加一个单件对象。整个项目可以用。
            services.AddSingleton(_ => Configuration);
        }

services 从哪儿来,是运行时传入的,

Configureation从哪儿来,它是(new ConfigurationBuilder( ) ).build()出的一个对象。包含项目的配置信息,比如author,conntectstring等,这样我们从其它地方可以访问。

我们转到controller中,增加下面的代码就算注入成功了。我们随时可以用_config来访问配置信息。

        private readonly IConfiguration _config;
        public HomeController(IConfiguration config)
        {
            _config = config;
        }

此时本应该去asp.net5的官方文档查一下,但上面到目前为止,依赖注入的章节标记为未完成,就是说还没人写出来。

然后去github找到https://github.com/aspnet/DependencyInjection, 上面写着这个包的用途是:

“Contains the common DI abstractions that ASP.NET 5 and EF 7 use, as well as adapters for some IoC containers”。

先下载下来源码吧!复制项目地址,然后到vs2015中,克隆一下。

先回到asp.net5的项目模版中,看一下这两个提示

的确,IServiceCollection的命名空间是依赖注入的名字,而AddSingleton的方法只是那个接口的一个扩展。

在AddSingleton方法上点右键,查看元信息。一切信息都对。

至此解决我了一个大疑惑:我一直以为IServiceCollection是asp.net5提供的许多服务呢,比如ef,mvc,route等服务。

如果想用MVC,则在服务中添加一下就行。谁他妈的能想到,这个service的意思是注入服务的。而且这个接口就是用来注入的。

这是克隆下来的源码,包含3个项目,可以在里面找一下上面的这些接口以及类,都可以找到。

由此更加可知,IServiceCollection就是依赖注入的一个接口。

待我细细读一下源码,再继续分析吧!

-------------------------------------------------------------------------------------

继续分析,先把昨天下午看的部分写一下,就是下面打红勾部分,很简单!

1~5都很简单,就是普通的类及集合的封装,所有的秘密可能都藏在6里,我还没弄懂!

第1: 只是一个接口,没有任何其它内容。它指示了集合对象是:ServiceDescriptor

public interface IServiceCollection : IList<ServiceDescriptor>
    {
    }

第2:以为很神秘的ServiceDescriptor,其实只一个普通的类。应该是待注册的每一个类的描述信息。

ServiceDescriptor主要是5个属性,以及大量的静态方法,这些方法也只是为了构造一个类对象。

  public ServiceLifetime Lifetime { get; }
  public Type ServiceType { get; }
  public Type ImplementationType { get; }
  public object ImplementationInstance { get; }
  public Func<IServiceProvider, object> ImplementationFactory { get; }

Lifetime属性是枚举值,就是第3个文件内容:

public enum ServiceLifetime
    {
        Singleton,
        Scoped,
        Transient  //短暂的,暂时的
    }

另外4个属性的目的就是提供两个值,服务的类型以及实现类型。这4个属性未必要构造时给值,就是说可以为空的,只要能判断出来那2个类型即可。并且这两个类型可以相同的。

这个类有3个构造函数,以及Instance,Describe,Transient,Scoped,Singleton这5个静态函数的扩展,使用大量重载。这5个静态函数最终都是调用构造函数,并返回ServiceDescriptor的一个对象。

第5:

  我感觉应该先讲第5,后讲第4. 前面提到IServiceCollection只是一个接口,接口继承了IList。那它怎么实现? 它实现的类内部还要增加一个List对象.

里面的方法都转为List方法的调用。

第4: 它是IServiceCollection静态扩展:

Add  AddTransient  AddScoped  AddSingleton  AddInstance ------最终都是调用Add直接插入到服务集合中

TryAdd  TryAddTransient  TryAddScoped  TryAddSingleton  TryAddEnumerable ------最终都是调用TryAdd直接插入到服务集合中

Replace   --去查找第1个ServiceType相同的元素,有就删除,最后插入这个服务。

至此,只是ServiceDescriptor 类以及ServiceCollection集合的一个实现。普普通通的两个类

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • c# 的析构以及垃圾回收2、3事!

    看书时,自己写的例子代码,了解到几个知识点,记载下来。同时发现自己手写代码的能力比较弱,还是得多写一下。

    申君健
  • Ef core中,定义实体类间的关系与它与表的映射形式!

    反思: 我认为价格商表是从表,它应该有一个Book的导航属性就对了, 但是作者是反其道而行之。 在从类里写一个外键属性!

    申君健
  • c#属性一点疑问

    申君健
  • Java多线程开发 - Future的使用与理解

    Future模式是多线程开发中非常常见的一种设计模式。它的核心思想是异步调用。当我们需要调用一个函数方法时。如果这个函数执行很慢,那么我们就要进行等待。但有时候...

    蒋老湿
  • OOAD-设计模式(三)之创建型设计模式(5种)

    前言   前面介绍了OOAD的基础知识,现在我们来详细的说明一下GOF设计模式中的23种模式,希望大家能够学到东西! 一、工厂方法模式(Factory Meth...

    用户1195962
  • jdk1.8中HashMap在扩容的时候做了哪些优化

    假设HashMap的容量为15转化成二进制为1111,length-1得出的二进制为1110 哈希值为1111和1110

    哲洛不闹
  • 【小家Spring】Spring AOP原理使用的基础类打点(AopInfrastructureBean、ProxyProcessorSupport、Advised、AjType)

    Spring AOP是整个Spring框架中最重要的内容之一。为了更好的深入查看它的原理,这篇文章主要是把它在关键位置使用到的一些常用类进行打点、解释一波,有助...

    YourBatman
  • 【插件开发】—— 10 JFace开发详解

    前几篇讲过SWT的使用,但是SWT是基本的小控件,只能针对使用简单的数据类型,比如字符串,数字等等。但是遇到了复杂的类,该怎么办呢? ?   不要担心!这...

    用户1154259
  • 看到他我一下子就悟了-- 泛型(2)

       先说些题外话,只所以写这些东西。是看了CSDN上的曹版主的一篇:手把手教编程,不知道有没有人愿意参与。说实话,我工作四年,总感觉晕晕乎乎的,好多技术都 懂...

    hbbliyong
  • Excel实战技巧68:创建级联列表框(使用ADO技巧)

    在《Excel实战技巧67:在组合框中添加不重复值(使用ADO技巧)》中,我们使用记录集技巧给组合框添加了不重复值,并概要讲述了ADO记录集基础知识。本文利用记...

    fanjy

扫码关注云+社区

领取腾讯云代金券