当前位置:网站首页>ASP. Net core dependency injection service life cycle
ASP. Net core dependency injection service life cycle
2022-04-23 17:05:00 【begeneral】
Dependency injection services include 3 A life cycle :Transient;Scoped;Singleton
Transient: Ready to use, ready to build , Discard after use . That is to create an instance of this service every time you get an instance of this service .
Scoped: This type of service instance is saved in the current dependency injection container (IServiceProvider) On , This will be explained in detail later .
Singleton: Single case . That is, only one service instance is saved
Let's do an example demonstration , Let us have a deeper understanding of this 3 Medium life cycle
My test environment :win10+vs2019+.net core 3.1
Create a new one .NET CORE The console application , add to NuGet package :Microsoft.Extensions.DependencyInjection and Microsoft.Extensions.DependencyInjection.Abstractions
Create a new one Base class , Inherited from IDisposable Interface . In this way, we can know when the instance inherited from the base class is released
Base The code for the class is as follows :
public class Base:IDisposable
{
public Base() => Console.WriteLine($"An Instance of {GetType().Name} is created");
public void Dispose() => Console.WriteLine($"The Instance of {GetType().Name} is disposed");
}
Then define 3 Interface , Represents the service type :
public interface IBaz
{
}
public interface IBar
{
}
public interface IFoo
{
}
Definition 3 Each implementation implements this 3 Interface classes , These classes inherit from Base and IDispose
public class Baz:Base,IBaz
{
}
public class Bar:Base,IBar
{
}
public class Foo:Base,IFoo
{
}
The next in Main Function to create a dependency injection container . This container is in using Created in statement , So when using At the end of the statement execution, it will call Dispose To release this container
static void Main(string[] args)
{
using (var root = new ServiceCollection().AddTransient<IFoo, Foo>()
.AddScoped<IBar, Bar>()
.AddSingleton<IBaz, Baz>().BuildServiceProvider())
{
using (var scope = root.CreateScope())
{
var provider = scope.ServiceProvider;
provider.GetService<IFoo>();
provider.GetService<IBar>();
provider.GetService<IBaz>();
Console.WriteLine("child container is disposed");
}
Console.WriteLine("root container is disposed");
}
Console.ReadKey();
}
Let's create a root container , Then create a sub container with this root container .3 The life cycles of service instances are Transient、Scoped、Singleton. The results are as follows :
Service instances are created when obtaining service instances , However, the release of instances is not together .Bar and Foo The life cycle of Scoped and Transient,
So when the sub container is released , this 2 An instance is released .Baz The life cycle of is a single case , It is stored in the root container (root) Inside , So when the sub container is released
When , It didn't release , The root container is not released until it is released .
about ASP.NET CORE applications , It has a global root container bound to the current application IServiceProvider object . For each request processed ,ASP.NET CORE
The framework will use this root container to create a service scope based on the current request ( That is to say Scoped Life cycle ), And use the IServiceProvider Object to provide the... Required for request processing
Service instance . After the request is processed ,Scoped The instance of the life cycle is terminated , The corresponding sub container is also released .
So in the same request ,Scoped Instances of the lifecycle are created only once . You can also try , Use... In the same request GetService Get... Many times Scoped Examples of life cycles ,
Then get... In multiple requests Scoped Examples of life cycles , In this way, everyone's understanding will be more profound .
版权声明
本文为[begeneral]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/04/202204230554081977.html
边栏推荐
- The new MySQL table has a self increasing ID of 20 bits. The reason is
- Tencent resolves the address according to the IP address
- VLAN高级技术,VLAN聚合,超级Super VLAN ,Sub VLAN
- Further optimize Baidu map data visualization
- 【生活中的逻辑谬误】稻草人谬误和无力反驳不算证明
- Node access to Alipay open platform sandbox to achieve payment function
- PyMySQL
- PHP高效读大文件处理数据
- Log4j output log information to file
- Detailed explanation of Milvus 2.0 quality assurance system
猜你喜欢
Node access to Alipay open platform sandbox to achieve payment function
Document operation II (5000 word summary)
EF core in ASP Generate core priority database based on net entity model
CentOS MySQL multi instance deployment
feign报400处理
Mock test
How vscode compares the similarities and differences between two files
Customize my_ Strcpy and library strcpy [analog implementation of string related functions]
groutine
oracle 中快速获取表的列名列表
随机推荐
Do you really understand the principle of code scanning login?
Promise (III)
Encapsulating the logging module
Promise (II)
Pseudo Distributed installation spark
Baidu Map 3D rotation and tilt angle adjustment
SQL: How to parse Microsoft Transact-SQL Statements in C# and to match the column aliases of a view
AIOT产业技术全景结构-数字化架构设计(8)
Scope and scope chain in JS
Shell脚本——Shell编程规范及变量
feign报400处理
Deeply understand the relevant knowledge of 3D model (modeling, material mapping, UV, normal), and the difference between displacement mapping, bump mapping and normal mapping
Getting started with JDBC
1-2 JSX syntax rules
Regular filtering of Intranet addresses and segments
自定义my_strcpy与库strcpy【模拟实现字符串相关函数】
线性代数感悟之1
MySQL restores data through binlog file
PyMySQL
∑GL-透视投影矩阵的推导