典型的依赖注入框架如 spring, asp.net mvc 的服务实例化时间点是?

2020-08-29 16:58:11 +08:00
 qW7bo2FbzbC0

疑问:

1.对于 singleton 的服务,是否是注入时实例化? 2.对于 transient 和 scoped 服务,是否取出时实例化? 3.对于含 db 交互的服务,是否应以 singleton 的方式注入? 4.对于 dbConn 或者 dbConnFactory,是否应以 transient 的方式注入?

1095 次点击
所在节点    问与答
13 条回复
Jooooooooo
2020-08-29 17:01:22 +08:00
没看懂

比如, 啥叫 singleton 的服务
qW7bo2FbzbC0
2020-08-29 17:44:14 +08:00
@Jooooooooo #1 singleton 可以认为是单例
Jooooooooo
2020-08-29 17:46:52 +08:00
@hjahgdthab750 单例服务是啥? 有什么特征? 淘宝后台是单例服务吗? 为什么不是或者为什么是?
qW7bo2FbzbC0
2020-08-29 18:43:14 +08:00
@Jooooooooo #3 我们好像说的不是同一个方向
Morge
2020-08-30 09:11:42 +08:00
singleton, transient, scoped 各自代表一种生命周期,注册服务的生命周期管理由框架内部的依赖注入容器来完成;依赖注入容器的使用步骤有 3 个,第一是注册依赖(Register),第二是解决依赖(Resolve),第三是资源释放(Release);服务是在解决依赖时根据服务生命周期进行实例化。
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 指的是对象的生命周期。对象的生命周期是在对象注册时由你自己手动指定的。

当你明确你的服务要活多久之后,你就知道,在进行服务注册的时候,应该使用哪种生命周期。
Morge
2020-08-30 09:44:05 +08:00
不要说 是否应以 singleton 的方式注入
要是 指定依赖的生命周期为 singleton, 以构造函数注入的方式进行注入
Morge
2020-08-30 09:44:19 +08:00
要是 --> 要说
fanshaohua
2020-08-30 21:12:05 +08:00
对于问题 3,4 。ASPNET Core 默认情况下数据库的 AddDBContext 是 Scoped 。

aspnetcore 关于依赖注入的文档:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-3.1#service-lifetimes

解释的比较清楚,希望能帮到你。
qW7bo2FbzbC0
2020-08-31 10:12:56 +08:00
@Morge #6 感谢老铁,很详细,我大概了解了
qW7bo2FbzbC0
2020-08-31 10:13:09 +08:00
@fanshaohua #9 感谢
qW7bo2FbzbC0
2020-08-31 10:18:40 +08:00
@Morge #7 再问一个问题,

若对 scoped 和 transtient 服务实现了 IDisposable 接口,在 controller 中调用该服务是否需要使用 using 关键字进行自动 dispose 还是交由框架自动处理?
forgottencoast
2020-09-15 23:02:29 +08:00
@hjahgdthab750 #12
容器会自己处理的。对于 scoped 和 transtient 来说,相当于把对象生命周期管理交给了容器,所以你就不要管了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/702432

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX