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

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

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

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

        public void ConfigureServices(IServiceCollection services)
{
//...
}

改为

        public IServiceProvider ConfigureServices(IServiceCollection services)
{
//...
}

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


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

默认的Program改为了

    public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}

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

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

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

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

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

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

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

实验一下

    public class DIBuilder
{
private string Name { get; }
private IServiceCollection Services { get; } public DIBuilder(string name,IServiceCollection services)
{
Name = name;
Services = services;
} public IServiceProvider BuilderServiceProvider()
{
return Services.BuildServiceProvider();
}
}

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

我们编写一个类继承IServiceProviderFactory

    public class DIServiceProviderFactory : IServiceProviderFactory<DIBuilder>
{
public DIBuilder CreateBuilder(IServiceCollection services)
{
return new DIBuilder("NCoreCoder", services);
} public IServiceProvider CreateServiceProvider(DIBuilder containerBuilder)
{
Console.WriteLine($"{containerBuilder.Name}");
return containerBuilder.BuilderServiceProvider();
}
}

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

调用一下DIServiceProviderFactory

正常输出了

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

再运行看看


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

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

增加一个方法,测试一下

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

运行再看看流程

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. 从零开始学Electron笔记(二)

    在之前的文章我们简单介绍了一下Electron可以用WEB语言开发桌面级应用,接下来我们继续说一下Electron的菜单创建和事件绑定. 我们接上一章的代码继续编写,上一章代码 https://www ...

  2. 【Python篇】工厂模式

    工厂方法模式 前言 在<设计模式>一书中工厂模式提到了: 工厂方法模式(Factory Method) 抽象工厂模式 (Abstract Factory) 但是在实际过程中还有一种工厂模式 ...

  3. gulp-less打包后calc属性计算不准确的问题

    .step-item{ width: calc((100% - 50px) / 2); &:nth-child(2){ margin-right: 0; } } 这样直接写的话,编译时会直接给 ...

  4. lottery+web2

    lottery 题目分析 题目给了一个彩票网站,经过页面的探索,没有发现明显漏洞,进行目录扫描,发现该站存在.git文件 猜测存在源码泄露,使用githack利用: 获得网页源码,进行源码分析 源码审 ...

  5. Mysql基础(四):库、表、记录的详细操作、单表查询

    目录 数据库03 /库.表.记录的详细操作.单表查询 1. 库的详细操作 3. 表的详细操作 4. 行(记录)的详细操作 5. 单表查询 数据库03 /库.表.记录的详细操作.单表查询 1. 库的详细 ...

  6. Python之爬虫从入门到放弃(十三) Scrapy框架整体的了解

    这里是通过爬取伯乐在线的全部文章为例子,让自己先对scrapy进行一个整理的理解 该例子中的详细代码会放到我的github地址:https://github.com/pythonsite/spider ...

  7. JavaScript 基础 学习 (四)

    JavaScript 基础 学习 (四) 解绑事件 dom级 事件解绑 ​ 元素.on事件类型 = null ​ 因为赋值的关系,所以给事件赋值为 null 的时候 ​ 事件触发的时候,就没有事件处理 ...

  8. 绕过CDN查找真实IP方法

    0x01 验证是否存在CDN 方法1: 很简单,使用各种多地 ping 的服务,查看对应 IP 地址是否唯一,如果不唯一多半是使用了CDN, 多地 Ping 网站有:http://ping.china ...

  9. OSCP Learning Notes - Capstone(2)

    BTRSys v2.1 Walkthrough Preparation: Download the BTRSys virtual machine from the following website: ...

  10. Python Ethical Hacking - BACKDOORS(6)

    File Upload: A file is a series of characters. Uploading a file is the opposite of downloading a fil ...