zoukankan      html  css  js  c++  java
  • asp.net core 服务的生命周期(DI)

    Net Core 三个常用的生命周期

    首先,我们想象一个这样一个场景。假设我们有寄快递的需求,那么我们会致电快递公司:“我们要寄快递,派一个快递员过来收货”。接着,快递公司会如何做呢?

    1. 一直派遣同一个快递员来收货。
    2. 第一周派遣快递员A、第二周派遣快递员B收货。
    3. 每次都派遣一个新的快递员收货。

    1.Transient:每一次GetService都会创建一个新的实例   瞬间生命周期 : 每次需要创建一个全新的

    2.Scoped:在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内) 单例进程唯一实例 :每一次请求都是同一个(多用于时间)

    3.Singleton:整个应用程序生命周期内只创建一个实例  

    上面描述的比较抽象,不容易理解,用实例来讲解会比较直观。

    下面通过具体的例子进行演示。

    定义三个空的接口:IArticleService、IProductService、IUserService

    然后定义三个实现:ArticleService、ProductService、UserService

    1.将接口和实现注入到DI容器

    在StartUp类的ConfigureServices方法添加下图代码

    复制代码
    public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc();
                services.Configure<Test>(Configuration.GetSection("Test"));
    
                //演示生命周期
                services.AddTransient<IUserService, UserService>();
                services.AddScoped<IArticleService, ArticleService>();
                services.AddSingleton<IProductService, ProductService>();
            }
    复制代码

    2.添加私有字段,在测试Controller:LifeTimeController中添加下图代码

    复制代码
    private readonly IUserService _userService1;
            private readonly IUserService _userService2;
            private readonly IArticleService _articleService1;
            private readonly IArticleService _articleService2;
            private readonly IProductService _productService1;
            private readonly IProductService _productService2;
    复制代码

    3.添加构造方法

    复制代码
    public LifeTimeController(
                IUserService userService1, IUserService userService2,
                IArticleService articleService1, IArticleService articleService2,
                IProductService productService1, IProductService productService2
            )
            {
                _userService1 = userService1;
                _userService2 = userService2;
                _articleService1 = articleService1;
                _articleService2 = articleService2;
                _productService1 = productService1;
                _productService2 = productService2;
            }
    复制代码

    4.添加测试代码

    复制代码
    public IActionResult Index()
            {
                var sb = new StringBuilder();
                sb.Append("transient1:" + _userService1.GetHashCode() + "<br />");
                sb.Append("transient2:" + _userService2.GetHashCode() + "<br />");
                sb.Append("scope1:" + _articleService1.GetHashCode() + "<br />");
                sb.Append("scope2:" + _articleService2.GetHashCode() + "<br />");
                sb.Append("singleton1:" + _productService1.GetHashCode() + "<br />");
                sb.Append("singleton2:" + _productService2.GetHashCode() + "<br />");
                
                Response.ContentType = "text/html";
                return Content(sb.ToString());
            }
    复制代码

    5.执行结果

    复制代码
    第一次刷新:
    
    transient1:66454027
    transient2:35021870
    scope1:38350037
    scope2:38350037
    singleton1:4417230
    singleton2:4417230
    
    第二次刷新:
    
    transient1:103653
    transient2:5079042
    scope1:47546512
    scope2:47546512
    singleton1:4417230
    singleton2:4417230
    复制代码

    可见

    transient类型的生命周期,每次使用都不一样,不同的类或不同的方法使用都不一样

    scope类型的生命周期,在同一个请求内是一样的

    singleton类型的生命周期,每次请求都是一样的

    所以理解了生命周期的作用,我们在开发的时候就可以根据需要对不同的服务选择不同的生命周期了。

  • 相关阅读:
    WebAssembly是什么?
    转《18个实时音视频开发中会用到开源项目》
    Windows Server服务器之介绍及版本信息
    软件开发方法
    SLA(服务等级协议)
    Linux系统之-介绍,主要特性
    Linux系统之-文件系统,桌面环境
    Linux系统之-常用命令及技巧
    网站运维都需要做什么工作
    Oracle Minus关键字
  • 原文地址:https://www.cnblogs.com/xiewenyu/p/13377631.html
Copyright © 2011-2022 走看看