Asp.Net Core 3.0出来很久了,预览版的时候就被我偶像Lemon大人,带着尝试摸索了一下这个

那么Asp.Net Core 3.0和Asp.Net Core 2.X到底有哪些区别呢?

Asp.Net Core 2.X是如何替换依赖注入容器的

三方替换DI容器是在Startup类的ConfigureServices方法上修改

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. //...
  4. }

改为

  1. public IServiceProvider ConfigureServices(IServiceCollection services)
  2. {
  3. //...
  4. }

三方修改DI是编写IServiceCollection类型的扩展方法,然后把返回值从void改为IServiceProvider


Asp.Net Core 3.0是如何替换依赖注入容器的

默认的Program改为了

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateHostBuilder(args).Build().Run();
  6. }
  7.  
  8. public static IHostBuilder CreateHostBuilder(string[] args) =>
  9. Host.CreateDefaultBuilder(args)
  10. .ConfigureWebHostDefaults(webBuilder =>
  11. {
  12. webBuilder.UseStartup<Startup>();
  13. });
  14. }

是不是有点变化?2.X以及以下都是WebHost.CreateDefaultBuilder,这里改成了Host.CreateDefaultBuilder

且Startup.ConfigureServices改为了返回值只能void了,那我们怎么修改DI容器呢?

Host有个替换DI容器的方法UseServiceProviderFactory

我们跟进去定义看看这个是什么

要实现一个IServiceProviderFactory的泛型接口~

我们跟踪以下这个接口的定义

先是通过IServiceCollection转换成一个泛型对象,再通过泛型对象转换成IServiceProvider对象了

实验一下

  1. public class DIBuilder
  2. {
  3. private string Name { get; }
  4. private IServiceCollection Services { get; }
  5.  
  6. public DIBuilder(string name,IServiceCollection services)
  7. {
  8. Name = name;
  9. Services = services;
  10. }
  11.  
  12. public IServiceProvider BuilderServiceProvider()
  13. {
  14. return Services.BuildServiceProvider();
  15. }
  16. }

因为IServiceProviderFactory要先把IServiceCollection传入,然后转换成容器,所以我们的DI容器得储存这些,才能最后从DI容器转换到IServiceProvider

我们编写一个类继承IServiceProviderFactory

  1. public class DIServiceProviderFactory : IServiceProviderFactory<DIBuilder>
  2. {
  3. public DIBuilder CreateBuilder(IServiceCollection services)
  4. {
  5. return new DIBuilder("NCoreCoder", services);
  6. }
  7.  
  8. public IServiceProvider CreateServiceProvider(DIBuilder containerBuilder)
  9. {
    Console.WriteLine($"{containerBuilder.Name}");
  10. return containerBuilder.BuilderServiceProvider();
  11. }
  12. }

最后返回IServiceProvider的时候,输出一个DIBuilder.Name

调用一下DIServiceProviderFactory

正常输出了

我们加一下输出信息,看看整体的DI流程

再运行看看


那么网上盛传的Startup.ConfigureContainer(T container)是怎么回事呢?

这里其实是配置我们自定义容器的东西的,比如有一些定制化DI的操作,那么就是这里面了

增加一个方法,测试一下

  1. public void ConfigureContainer(DIBuilder builder)
  2. {
  3. Console.WriteLine($"Startup.ConfigreContainer Name:{builder.Name}");
  4. }

运行再看看流程

Startup.ConfigureServices->ServiceProviderFactory.CreateBuilder->Startup.ConfigureContainer(可忽略)->ServiceProviderFactory.CreateServiceProvider->Startup.Configure


打个广告 如果对于这篇文章有什么要交流的,欢迎加Q群 386092459

Asp.Net Core 3.0的依赖注入改变的更多相关文章

  1. 基础教程:视图中的ASP.NET Core 2.0 MVC依赖注入

    问题 如何在ASP.NET Core MVC Views中注入和使用服务. 解 更新 启动 类来为MVC添加服务和中间件. 添加一项服务 添加一个Controller,返回 ViewResult. 添 ...

  2. ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法

    在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...

  3. [ASP.NET Core 3框架揭秘] 依赖注入:控制反转

    ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...

  4. [ASP.NET Core 3框架揭秘] 依赖注入[5]: 利用容器提供服务

    毫不夸张地说,整个ASP.NET Core框架是建立在依赖注入框架之上的.ASP.NET Core应用在启动时构建管道以及利用该管道处理每个请求过程中使用到的服务对象均来源于依赖注入容器.该依赖注入容 ...

  5. [ASP.NET Core 3框架揭秘] 依赖注入[2]:IoC模式

    正如我们在<依赖注入:控制反转>提到过的,很多人将IoC理解为一种"面向对象的设计模式",实际上IoC不仅与面向对象没有必然的联系,它自身甚至算不上是一种设计模式.一般 ...

  6. [ASP.NET Core 3框架揭秘] 依赖注入:IoC模式

    原文:[ASP.NET Core 3框架揭秘] 依赖注入:IoC模式 正如我们在<依赖注入:控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式”,实际上IoC不仅与面向对象没 ...

  7. ASP.NET Core技术研究-探秘依赖注入框架

    ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET ...

  8. [ASP.NET Core 3框架揭秘] 依赖注入[8]:服务实例的生命周期

    生命周期决定了IServiceProvider对象采用怎样的方式提供和释放服务实例.虽然不同版本的依赖注入框架针对服务实例的生命周期管理采用了不同的实现,但总的来说原理还是类似的.在我们提供的依赖注入 ...

  9. [ASP.NET Core 3框架揭秘] 依赖注入[10]:与第三方依赖注入框架的适配

    .NET Core具有一个承载(Hosting)系统,承载需要在后台长时间运行的服务,一个ASP.NET Core应用仅仅是该系统承载的一种服务而已.承载系统总是采用依赖注入的方式来消费它在服务承载过 ...

随机推荐

  1. C#读取Excel转换为DataBle

    /// <summary> /// Excel->DataTable /// </summary> /// <param name="filePath&q ...

  2. 使用virtualBox 创建虚拟机

    第一次使用感觉并没有VMware好用,尤其是鼠标在虚拟机和宿主机之间切换的时候很烦,需要按键盘右边ctrl虽然有提示right ctrl但是第一次使用硬是折腾了好半天.感觉不记录一下对不起这个下午. ...

  3. 怎么查看HBase表的创建时间

    前几天HBase出现了RIT告警,忽然发现发出告警的Region所属的表并不是我创建出来的,于是就想看看这些表是怎么来的. 一时也没什么头绪,就先看看这些表是什么时候创建出来的吧,然后再根据时间点看看 ...

  4. scrapy shell 的使用

    是什么?:是一个终端下的调试工具,用来调试scrapy 安装ipython :pip install ipython 启动: scrapy shell + 需要请求的url 进来之后,response ...

  5. MYSQL 之 JDBC(十六): DBUtils

    DBUtils是Apache组织提供的一个开源的JDBC工具类库,能极大简化jdbc编码的工作量 API介绍 QueryRunner ResultSetHandler 工具类DbUtils 用DBUt ...

  6. 01 flask源码剖析之werkzurg 了解wsgi

    01 werkzurg了解wsgi 目录 01 werkzurg了解wsgi 1. wsgi 2. flask之werkzurg源码流程 3. 总结 1. wsgi django和flask内部都没有 ...

  7. 前端06 /JavaScript之BOM、DOM

    前端06 /JavaScript 目录 前端06 /JavaScript 昨日内容回顾 js的引入 js的编程要求 变量 输入输出 基础数据类型 number string boolean null ...

  8. Go的100天之旅-03变量

    变量 变量介绍 变量这个词来源于数学,类似方程中的x.y,代表的是存储在计算机中的值.这里主要介绍Go和其它编程语言不一样的地方,在前面我们提到过,Go是一门静态语言.静态语言区别动态语言一个重要的特 ...

  9. P1776 宝物筛选

    题目: 正文: 啊,多重背包真恶心... 一开始我是把多重背包改成了01背包,然鹅我当时是直接1个1个的往后摞的... 参见以下代码: for(int i=1;i<=n;++i){//平平无奇的 ...

  10. Spark实现wordcount的几种方式

    方法一:map + reduceByKey package com.cw.bigdata.spark.wordcount import org.apache.spark.rdd.RDD import ...