.NET Core学习——singleton和scoped

问题:

Invalid Operation Exception : Cannot consume scoped service 'XX.XX.XXX' from singleton 'YY.YY.YYY'.

原因:

是 DI 容器注册的问题,xxx 被注册为 scoped ,yyy 被注册为 singleton ,yyy 通过构造函数注入了 xxx ,结果引发该异常,将 yyy 也注册为 scoped 后问题解决。

Singleton是不是不能依赖Scoped

singleton和scoped :

services.AddSingleton<ITodoItemService, FakeTodoItemService>();
services.AddScoped<ITodoItemService, TodoItemService>();

AddTransient、AddSingleton、AddScoped的区别

权重:

AddSingleton→AddTransient→AddScoped

AddSingleton的生命周期:

项目启动-项目关闭   相当于静态类  只会有一个  

AddScoped的生命周期:

请求开始-请求结束  在这次请求中获取的对象都是同一个 

AddTransient的生命周期:

请求获取-(GC回收-主动释放) 每一次获取的对象都不是同一个

控制器

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

[HttpGet]

       public IActionResult SetTest()

       {

           sing.Age = 18;

           sing.Name = "小红";

 

           tran.Age = 19;

           tran.Name = "小明";

 

           scon.Age = 20;

           scon.Name = "小蓝";

 

           aService.RedisTest();

 

           return Json("OK");

       }

  注入

1

2

3

4

5

6

public static void AddTestTran(this IServiceCollection service) {

           service.AddTransient<ITranTest, TranTest>();

           service.AddSingleton<ISingTest, SingTest>();

           service.AddScoped<ISconTest, SconTest>();

           service.AddScoped<IAService, AService>();

       }

  服务:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

public class AService: IAService

    {

        private ISingTest sing; ITranTest tran; ISconTest scon;

        public AService(ISingTest sing, ITranTest tran, ISconTest scon)

        {

            this.sing = sing;

            this.tran = tran;

            this.scon = scon;

        }

        public void RedisTest()

        {

 

        }

    }

  

AddSingleton的对象没有变

AddScoped的对象没有变化

AddTransient的对象发生变化

------------------------------------------------------------

请求get

AddSingleton的对象没有变

AddScoped的对象发生变化

AddTransient的对象发生变化

注意:

由于AddScoped对象是在请求的时候创建的

所以不能在AddSingleton对象中使用

甚至也不能在AddTransient对象中使用 

所以权重为

AddSingleton→AddTransient→AddScoped 

不然则会抛如下异常

 

本文摘自  https://www.cnblogs.com/AnAng/p/9370913.html  仅作为学习记录

 

相关文章:

深入理解net core中的依赖注入、Singleton、Scoped、Transient(一)

深入理解net core中的依赖注入、Singleton、Scoped、Transient(二)

深入理解net core中的依赖注入、Singleton、Scoped、Transient(三)

深入理解net core中的依赖注入、Singleton、Scoped、Transient(四)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值