• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

asp.netcore服务的生命周期(DI)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

 

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
关于ASP.NETMVC的Filter小记发布时间:2022-07-10
下一篇:
asp.netmvc3简单缓存+sql依赖发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap