zoukankan      html  css  js  c++  java
  • net core体系-web应用程序-4net core2.0大白话带你入门-9asp.net core服务的生命周期

    asp.net core服务的生命周期

     

    Transient:每一次GetService都会创建一个新的实例

    Scoped:在同一个Scope内只初始化一个实例 ,可以理解为( 每一个request级别只创建一个实例,同一个http request会在一个 scope内)

    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类型的生命周期,每次请求都是一样的

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

    IT黑马
  • 相关阅读:
    android数据恢复
    UVA 690 Pipeline Scheduling
    2017 国庆湖南 Day4
    2017 国庆湖南 Day5
    2017 国庆湖南 Day6
    2017国庆 清北学堂 北京综合强化班 Day1
    2017 国庆湖南Day2
    bzoj 2962 序列操作
    UVA 818 Cutting Chains
    UVA 211 The Domino Effect
  • 原文地址:https://www.cnblogs.com/hmit/p/10767493.html
Copyright © 2011-2022 走看看