首页 > 其他分享 >.Net Core框架容器依赖注入的生命周期

.Net Core框架容器依赖注入的生命周期

时间:2024-02-20 16:22:08浏览次数:22  
标签:容器 生命周期 Core Created childProvider1 GetService 实例 Net public

一.前言

  框架中依赖注入容器包括了三种生命周期,Singleton、Scoped和Transient。

  Singleton是全局实例,它存储到根容器上,从任何容器解析都会得到全局唯一的实例。

  Transient是瞬时实例,它不会存储到容器上,从任何容器解析都会重新实例化一个新的对象。

  Scoped是域内实例,哪个域的容器解析它,它就存储到哪个域的容器中,从这个域内解析得到都是同一个实例。

二.例子

public class Program
{
    public static void Main(string[] args)
    {
        var rootProvider = new ServiceCollection()
            .AddTransient<IA, A>()
            .AddScoped<IB, B>()
            .AddSingleton<IC, C>()
            .BuildServiceProvider();
        //create child provider
        var childProvider1 = rootProvider.CreateScope().ServiceProvider;
        var childProvider2 = rootProvider.CreateScope().ServiceProvider;

        GetService<IA>(childProvider1);
        GetService<IB>(childProvider1);
        GetService<IC>(childProvider1);
        Console.WriteLine();
        GetService<IA>(childProvider2);
        GetService<IB>(childProvider2);
        GetService<IC>(childProvider2);
        Console.WriteLine("Run Method End...");
    }

    public static void GetService<T>(IServiceProvider serviceProvider)
    {
        serviceProvider.GetService<T>();
        serviceProvider.GetService<T>();
    }
}
public interface IA { }
public interface IB { }
public interface IC { }
public class Base
{
    public Base()
    {
        Console.WriteLine($"{GetType().Name} Created");
    }
}
public class A : Base, IA { }
public class B : Base, IB { }
public class C : Base, IC { }

  运行,得到结果。

A Created
A Created
B Created
C Created

A Created
A Created
B Created
Run Method End...

  调用serviceProvider.GetService<T>()方法,可以创建实例并存储到容器上,获取获取之前创建的实例。调用该方法相当于一次请求,而在调用该方法的地方就是该请求的域。

  子容器childProvider1中 A对象被创建了两次,所以AddTransient每次请求时都会创建一个新的实例。

  子容器childProvider1中 B对象被创建了一次,所以AddScoped在同一域的请求中只创建一次实例。

  子容器childProvider1中 C对象被创建了一次,子容器childProvider2就没有创建实例,所以AddSingleton在整个程序中只创建一次实例。

 

 

 

 

 

 

 

 

  

标签:容器,生命周期,Core,Created,childProvider1,GetService,实例,Net,public
From: https://www.cnblogs.com/shadoll/p/15662013.html

相关文章

  • Kubernetes (K8S) 一
    K8Sansible#应用级别的跨主机编排工具docker#容器引擎容器运行时dockerfile#构建镜像docker-compose#单机容器集群编排工具docker-swarm#Docker旗下的容器跨主机编排工具,是实现在多级上Docker容器集群管理调度的工具mosos|marathonmosos:分布式资......
  • 李宏毅《机器学习》总结 - 2022 HW8(Anomaly Detection、ResNet) Strong Baseline
    重新学习了一下ResNet。。这作业平均一跑就是3、4个小时题目大意是让你做异常检测(anomalydetection),即给你一些正常的图片,再让你测试图片是正常的还是异常的(可以理解为2分类问题,只不过其中一个类别是无限大的)代码:https://www.kaggle.com/code/skyrainwind/hw8-anomaly-detec......
  • kubernetes创建的ingress规则不生效
    kubernetes创建的ingress规则不生效解决方法一:给创建ingress的yaml文件添加ingressClassName参数:​ 查看ingressclass[root@k8s-master012-4]#kubectlgetingressclassNAMECONTROLLERPARAMETERSAGEnginxk8s.io/ingress-nginx<none>22h......
  • 安卓活动生命周期以及数据存储
    Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称作返回栈(BackStack)。栈是一种后进先出的数据结构,在默认情况下,每当我们启动了一个新的活动,它会在返回栈中入栈,并处于栈顶的位置。而每当我们按下Back键或调用finish()方法去销毁一个活动......
  • .net core微服务之服务发现
    一:nacoshttps://nacos.io/docs/latest/what-is-nacos/https://github.com/alibaba/nacos二:consulhttps://developer.hashicorp.com/consul/docs?product_intent=consulhttps://github.com/hashicorp/consul服务发现的框架常用的还有zookeepereureka等,这里......
  • NET8下生成二维码
    NET8下生成二维码按网上搜索的总是多少有些问题,得总搜索好几次才能解决的,现把自己用过的可以生成的代码放上来,以备后用2024年02月20日在VS2022,NET8,MVC项目上使用通过引入NUGET:ZXing.Net.Bindings.ZKWeb.System.Drawing控制器代码: usingMicrosoft.AspNetCore.Mvc;us......
  • .NET配置文件大揭秘:轻松读取JSON、XML、INI和环境变量
     概述:.NET中的IConfiguration接口提供了一种多源读取配置信息的灵活机制,包括JSON、XML、INI文件和环境变量。通过示例,清晰演示了从这些不同源中读取配置的方法,使配置获取变得方便且易于扩展。这种方式适用于不同场景,如API密钥、数据库连接等,为应用提供了高度可配置性。在.NET......
  • 探索MVVM Toolkit:简化.NET应用开发,构建高效MVVM架构
     概述:MVVMToolkit是.NET平台的强大工具包,旨在简化MVVM应用程序开发。提供基础功能如ViewModelBase和RelayCommand,支持数据绑定和命令绑定,通过Messenger实现消息订阅发布。其高级功能包括ObservableObject和WeakEventListener,助力开发人员构建可维护、高性能的MVVM应用,提升用......
  • .NET周刊【2月第2期 2024-02-11】
    国内文章C#/.NET该如何自学入门?https://www.cnblogs.com/Can-daydayup/p/18006914随着DotNetGuide技术社区交流群的扩大,很多新成员希望知道如何自学C#/.NET。本文提出了自学建议:首先要了解语言特点与发展,然后制定详细学习计划,以微软官方文档为学习起点,并结合动手实践与其他资源......
  • 学习总结基于VUE+ASP.NET Core mvc+EFCore+Axios.js+ehcart.js开发一个web应用
    Vue是一个用于构建用户界面(基于数据渲染出用户看到的页面)的渐进式(循序渐进)框架。分为(声明式渲染,基于js包、组建系统、客户端路由、大规模状态管理和构建工具)Vue的使用方法分为:1.Vue核心包开发:局部模块改造;2.Vue核心包+Vue插件工程化开发:整站开发1.开始之前准备下述包 在prog......