Asp.Net Core中DI的知识总结
在asp.net core中DI的概念是由这几部分组成的:
IServiceCollection,保存IServiceDescriptor实例的列表
IServiceProvider,只有一个方法GetService,用来获取服务。ServiceProvider由一个Scope的概念,是通过CreateScope(它又调用了IServiceScopeFactory)来创建一个IServiceScope,这个IServceScope中包含一个新创建的IserviceProvider。
IServiceDescriptor,用来描述服务,包括service type,Implementation type,service life time.
ServiceLifeTime,描述服务的生命周期,有三种生命周期:
Singleton
Scope
Transient
DI就是由上述这四个主要的类型外加一大堆扩展方法而形成的。
ServiceProvider作为DI容器,内部维护一个已注册服务的列表,第一个产生的ServiceProvider叫做根容器,通过它创建的容器叫做子容器,所有创建的ServiceProvider都共享这个已注册服务的列表。
三种生命周期的注册方式也主要是通过将服务注册在根容器还是子容器来达到目的的。并且,如果一个服务实现了IDisposable接口,相应的,容器也会负责调用服务的Dispose方法。也就说,服务注册在哪里,哪里就服务销毁它。
Singleton
单例模式。IServiceProvider作为DI容器,单例模式的服务会被注册到根容器上面。它的生命周期会随根容器的销毁而销毁,也就是说,应用程序停掉了它才会销毁。
Scope
Scope实际上是由一个IServiceScope接口来描述的,上面有写,它是由ServiceProvider的一个扩展方法CreateScope来实现的,内部由IserviceScopeFacrory来最终生成一个Scope,这个Scope生成的时候会创建一个新的ServiceProvider,利用新生成的ServiceProvider来提供的服务也就形成了一个Scope的概念。顺便插一句,任何一个ServiceProvider都由一个根容器的引用,所以的Provider都引用了同一个根容器。它的生命周期随创建它的ServiceProvider的销毁而销毁,在asp.net core里面,当客户端发起请求时,都会新创建一个Scope,然后都是利用这个新创建的Scope中的ServiceProvider属性来提供服务的。
Transient
随用随取,用完就销毁。它的生命周期通Scope,都是随创建它的ServiceProvider的销毁而销毁。
Scope的特殊说明
一般情况下,生命周期较长的服务不应该依赖一个生命周期较短的服务,BuildServiceProvider方法可以传入一个bool类型的参数,这个参数解决了这么一个问题:
举个例子,比方说在asp.net core项目中我们使用entity framework core,要添加一个DbContext,这个DbContext是被添加成Scope生命周期的,也就是说它会随着请求的发起创建,请求结束后消亡。但是如果他被一个Singleton的服务所依赖/引用,那么它的生命周期就会变成Singleton。这个连接永远都不会释放,当许多请求过来的时候,数据库的连接池的连接就会变得不够用。这本身是一种错误的实践,避免这样的错误就是在BuilServiceProvider这个方法中传入一个true的bool值,只是DI在注入服务的时候要判断Scope的服务是否被错误的使用,一般来说错误的使用有两种情况:
第一种情况是用根ServiceProvider来创建一个Scope的服务。在根容器上面创建的服务会由根容器来负责销毁,那么也就是说,Scope的服务也就变成了Singleton的了。因为根容器只有在应用程序停止运行的时候才会销毁。
第二种情况是Scope的服务被Singleton的服务依赖/引用。那么这个Scope的服务也会随依赖它的Singleton服务变成Singleton的。
Asp.Net Core中DI的知识总结的更多相关文章
- 浅谈ASP.NET Core中的DI
DI的一些事 传送门马丁大叔的文章 什么是依赖注入(DI: Dependency Injection)? 依赖注入(DI)是一种面向对象的软件设计模式,主要是帮助开发人员开发出松耦合的应用程序 ...
- ASP.NET Core中的依赖注入(2):依赖注入(DI)
IoC主要体现了这样一种设计思想:通过将一组通用流程的控制从应用转移到框架之中以实现对流程的复用,同时采用"好莱坞原则"是应用程序以被动的方式实现对流程的定制.我们可以采用若干设计 ...
- ASP.NET Core中的ActionFilter与DI
一.简介 前几篇文章都是讲ASP.NET Core MVC中的依赖注入(DI)与扩展点的,也许大家都发现在ASP.NET CORE中所有的组件都是通过依赖注入来扩展的,而且面向一组功能就会有一组接口或 ...
- 浅谈ASP.NET Core中IOC与DI的理解和使用
说起IOC和DI,使用过ASP.NET Core的人对这两个概念一定不陌生,早前,自己也有尝试过去了解这两个东西,但是一直觉得有点很难去理解,总觉得对其还是模糊不清,所以,趁着今天有空,就去把两个概念 ...
- ASP.NET Core Web 应用程序系列(三)- 在ASP.NET Core中使用Autofac替换自带DI进行构造函数和属性的批量依赖注入(MVC当中应用)
在上一章中主要和大家分享了在ASP.NET Core中如何使用Autofac替换自带DI进行构造函数的批量依赖注入,本章将和大家继续分享如何使之能够同时支持属性的批量依赖注入. 约定: 1.仓储层接口 ...
- ASP.NET Core Web 应用程序系列(二)- 在ASP.NET Core中使用Autofac替换自带DI进行批量依赖注入(MVC当中应用)
在上一章中主要和大家分享在MVC当中如何使用ASP.NET Core内置的DI进行批量依赖注入,本章将继续和大家分享在ASP.NET Core中如何使用Autofac替换自带DI进行批量依赖注入. P ...
- Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
QuartzHostedService 是一个用来在Asp.Net Core 中实现 Quartz 的任务注入依赖的nuget 包: 基本示例如下: using System; using Syst ...
- 在Asp.Net Core中使用中间件保护非公开文件
在企业开发中,我们经常会遇到由用户上传文件的场景,比如某OA系统中,由用户填写某表单并上传身份证,由身份管理员审查,超级管理员可以查看. 就这样一个场景,用户上传的文件只能有三种人看得见(能够访问) ...
- C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入
C# 嵌入dll 在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...
随机推荐
- python接口自动化(一)--什么是接口、接口优势、类型(详解)
简介 经常听别人说接口测试,接口测试自动化,但是你对接口,有多少了解和认识,知道什么是接口吗?它是用来做什么的,测试时候要注意什么?坦白的说,笔者之前也不是很清楚.接下来先看一下接口的定义. 定义 接 ...
- ASP.NET Core中使用自定义MVC过滤器属性的依赖注入
除了将自己的中间件添加到ASP.NET MVC Core应用程序管道之外,您还可以使用自定义MVC过滤器属性来控制响应,并有选择地将它们应用于整个控制器或控制器操作. ASP.NET Core中常用的 ...
- Java基础系列-Enum深入解析
原创文章,转载请标注出处:https://www.cnblogs.com/V1haoge/p/10755129.html 一.概述 枚举就是一个语法糖效果. 定义一个枚举,其实就是定义一个继承抽象类E ...
- DS控件库 在Combobox中嵌入远程桌面
本示例演示DS开放式下拉列表控件中加入一个RDP远程桌面控件. 先在VS工具箱中添加COM控件Microsoft RDP Client Control,后面的Version版本可以适当高点. 然后将R ...
- socket,模拟服务器、客户端通信
服务器代码: using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;u ...
- Java 工厂模式(一)— 工厂方法(Factory Method)模式
一.工厂方法(Factory Method)模式: 1.什么是工厂方法模式? 工厂方法模式是类的创建型模式,又叫做虚拟构造子模式或者多态工厂模式.它的意义是创建产品对象的工厂接口,将实际创建工作推迟到 ...
- Hadoop综合大作业
Hadoop综合大作业 要求: 用Hive对爬虫大作业产生的文本文件(或者英文词频统计下载的英文长篇小说)词频统计. 用Hive对爬虫大作业产生的csv文件进行数据分析 1. 用Hive对爬虫大作业产 ...
- iframe 父页面调用子页面的vue方法
父页面代码: html: <div id="app"> //省略业务代码x行..... <iframe sr ...
- php禁用函数设置及查看方法详解
这篇文章主要介绍了php禁用函数设置及查看方法,结合实例形式分析了php禁用函数的方法及使用php探针查看禁用函数信息的相关实现技巧,需要的朋友可以参考下 本文实例讲述了php禁用函数设置及查看方法. ...
- SAP MM '独立/集中'等于1的MTS物料MRP运行后合并需求触发PR
SAP MM '独立/集中'等于1的MTS物料MRP运行后合并需求触发PR Test data 独立与集中: 1 (仅个别需求) STO 1, 这是一个公司间STO,从国内生产基本转入香港贸易公司, ...