问题:
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 |
|
注入
1 2 3 4 5 6 |
|
服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
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(二)