Asp.Net Core 3.0的依赖注入改变
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的依赖注入改变的更多相关文章
- 基础教程:视图中的ASP.NET Core 2.0 MVC依赖注入
问题 如何在ASP.NET Core MVC Views中注入和使用服务. 解 更新 启动 类来为MVC添加服务和中间件. 添加一项服务 添加一个Controller,返回 ViewResult. 添 ...
- ASP.NET Core中如影随形的”依赖注入”[下]: 历数依赖注入的N种玩法
在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程层面.在ASP.NET ...
- [ASP.NET Core 3框架揭秘] 依赖注入:控制反转
ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样 ...
- [ASP.NET Core 3框架揭秘] 依赖注入[5]: 利用容器提供服务
毫不夸张地说,整个ASP.NET Core框架是建立在依赖注入框架之上的.ASP.NET Core应用在启动时构建管道以及利用该管道处理每个请求过程中使用到的服务对象均来源于依赖注入容器.该依赖注入容 ...
- [ASP.NET Core 3框架揭秘] 依赖注入[2]:IoC模式
正如我们在<依赖注入:控制反转>提到过的,很多人将IoC理解为一种"面向对象的设计模式",实际上IoC不仅与面向对象没有必然的联系,它自身甚至算不上是一种设计模式.一般 ...
- [ASP.NET Core 3框架揭秘] 依赖注入:IoC模式
原文:[ASP.NET Core 3框架揭秘] 依赖注入:IoC模式 正如我们在<依赖注入:控制反转>提到过的,很多人将IoC理解为一种“面向对象的设计模式”,实际上IoC不仅与面向对象没 ...
- ASP.NET Core技术研究-探秘依赖注入框架
ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET ...
- [ASP.NET Core 3框架揭秘] 依赖注入[8]:服务实例的生命周期
生命周期决定了IServiceProvider对象采用怎样的方式提供和释放服务实例.虽然不同版本的依赖注入框架针对服务实例的生命周期管理采用了不同的实现,但总的来说原理还是类似的.在我们提供的依赖注入 ...
- [ASP.NET Core 3框架揭秘] 依赖注入[10]:与第三方依赖注入框架的适配
.NET Core具有一个承载(Hosting)系统,承载需要在后台长时间运行的服务,一个ASP.NET Core应用仅仅是该系统承载的一种服务而已.承载系统总是采用依赖注入的方式来消费它在服务承载过 ...
随机推荐
- [JAVA]多线程之实现Callable接口
通过继承Callable方式实现的多线程可以获取线程执行后的返回值 示例代码如下: public class Counter implements Callable<Integer> { ...
- 清空网站浏览记录就行啦?看Python如何实时监控网站浏览记录
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 需求: (1) 获取你对象chrome前一天的浏览记录中的所有网址(url ...
- 使用命名管道承载gRPC
最近GRPC很火,感觉整RPC不用GRPC都快跟不上时髦了. gRPC设计 刚好需要使用一个的RPC应用系统,自然而然就盯上了它,但是它真能够解决所有问题吗?不见得,先看看他的优点: gRPC是一种与 ...
- 解决nginx 出现 413:Request Entity Too Large
去网上搜了一下,说是上传文件大小超过nginx的限制大小(nginx据说默认只能上传不超过2MB的文件) 解决方法: #nginx/conf/nginx.conf http { ... client_ ...
- java 基本语法(十二) 数组(五)Arrays工具类的使用
1.理解:① 定义在java.util包下.② Arrays:提供了很多操作数组的方法. 2.使用: //1.boolean equals(int[] a,int[] b):判断两个数组是否相等. i ...
- 用python批量处理Excel表格,处理结果又快又好,做办公室最靓的那个仔
使用python批量处理Excel数据 让你根据Excel上所有人的身份证号码,提取出公司员工的生日 让你每个月都将公司所有人的考勤数据整理一下 类似这样的格式化的重复操作,你还在每次都使用的 ...
- OSCP Learning Notes - Exploit(3)
Modifying Shellcode 1. Search “vulnserver exploit code” on the Internet. Find the following website ...
- 【Python学习笔记四】获取html内容之后,如何提取信息:使用正则表达式筛选
在能够获取到网页内容之后,发现内容很多,那么下一步要做信息的筛选,就和之前的筛选图片那样 而在python中可以通过正则表达式去筛选自己想要的数据 1.首先分析页面内容信息,确定正则表达式.例如想获取 ...
- C++语法小记---类模板
类模板 类模板和函数模板类似,主要用于定义容器类 类模板可以偏特化,也可以全特化,使用的优先级和函数模板相同 类模板不能隐式推倒,只能显式调用 工程建议: 模板的声明和实现都在头文件中 成员函数的实现 ...
- java valid 注解使用-java validation注解详解
注解 描述 @AssertFalse 带注解的元素必须为false,支持boolean/Boolean @AssertTrue 带注解的元素必须为true,支持boolean/Boolean @Dec ...