疑问:
1.对于 singleton 的服务,是否是注入时实例化? 2.对于 transient 和 scoped 服务,是否取出时实例化? 3.对于含 db 交互的服务,是否应以 singleton 的方式注入? 4.对于 dbConn 或者 dbConnFactory,是否应以 transient 的方式注入?
1
Jooooooooo 2020-08-29 17:01:22 +08:00
没看懂
比如, 啥叫 singleton 的服务 |
2
qW7bo2FbzbC0 OP @Jooooooooo #1 singleton 可以认为是单例
|
3
Jooooooooo 2020-08-29 17:46:52 +08:00
@hjahgdthab750 单例服务是啥? 有什么特征? 淘宝后台是单例服务吗? 为什么不是或者为什么是?
|
4
qW7bo2FbzbC0 OP @Jooooooooo #3 我们好像说的不是同一个方向
|
5
Morge 2020-08-30 09:11:42 +08:00
singleton, transient, scoped 各自代表一种生命周期,注册服务的生命周期管理由框架内部的依赖注入容器来完成;依赖注入容器的使用步骤有 3 个,第一是注册依赖(Register),第二是解决依赖(Resolve),第三是资源释放(Release);服务是在解决依赖时根据服务生命周期进行实例化。
|
6
Morge 2020-08-30 09:39:30 +08:00
1. 对于生命周期为 singleton 的服务, 它活的和 spring,asp.net mvc 应用一样长,只在第一次解决依赖时创建对象,后面再解决都是返回引用。
2. scoped 表示某个范围内 singleton , 例如,生命周期为 scoped 的服务,在一个 http 请求的范围内只有一个实例。生命周期为 scoped 的服务在范围内,解决依赖时只创建一次。 生命周期为 transient 的服务,每次解决依赖都会创建一个新对象。 singleton,scoped,transient 指的是对象的生命周期。对象的生命周期是在对象注册时由你自己手动指定的。 当你明确你的服务要活多久之后,你就知道,在进行服务注册的时候,应该使用哪种生命周期。 |
7
Morge 2020-08-30 09:44:05 +08:00
不要说 是否应以 singleton 的方式注入
要是 指定依赖的生命周期为 singleton, 以构造函数注入的方式进行注入 |
8
Morge 2020-08-30 09:44:19 +08:00
要是 --> 要说
|
9
fanshaohua 2020-08-30 21:12:05 +08:00 via Android
对于问题 3,4 。ASPNET Core 默认情况下数据库的 AddDBContext 是 Scoped 。
aspnetcore 关于依赖注入的文档: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1#service-lifetimes 解释的比较清楚,希望能帮到你。 |
10
qW7bo2FbzbC0 OP @Morge #6 感谢老铁,很详细,我大概了解了
|
11
qW7bo2FbzbC0 OP @fanshaohua #9 感谢
|
12
qW7bo2FbzbC0 OP @Morge #7 再问一个问题,
若对 scoped 和 transtient 服务实现了 IDisposable 接口,在 controller 中调用该服务是否需要使用 using 关键字进行自动 dispose 还是交由框架自动处理? |
13
forgottencoast 2020-09-15 23:02:29 +08:00
@hjahgdthab750 #12
容器会自己处理的。对于 scoped 和 transtient 来说,相当于把对象生命周期管理交给了容器,所以你就不要管了。 |