V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qW7bo2FbzbC0
V2EX  ›  问与答

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

  •  
  •   qW7bo2FbzbC0 · 2020-08-29 16:58:11 +08:00 · 1093 次点击
    这是一个创建于 1574 天前的主题,其中的信息可能已经有所发展或是发生改变。

    疑问:

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

    13 条回复    2020-09-15 23:02:29 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2020-08-29 17:01:22 +08:00
    没看懂

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

    当你明确你的服务要活多久之后,你就知道,在进行服务注册的时候,应该使用哪种生命周期。
    Morge
        7
    Morge  
       2020-08-30 09:44:05 +08:00
    不要说 是否应以 singleton 的方式注入
    要是 指定依赖的生命周期为 singleton, 以构造函数注入的方式进行注入
    Morge
        8
    Morge  
       2020-08-30 09:44:19 +08:00
    要是 --> 要说
    fanshaohua
        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

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

    若对 scoped 和 transtient 服务实现了 IDisposable 接口,在 controller 中调用该服务是否需要使用 using 关键字进行自动 dispose 还是交由框架自动处理?
    forgottencoast
        13
    forgottencoast  
       2020-09-15 23:02:29 +08:00
    @hjahgdthab750 #12
    容器会自己处理的。对于 scoped 和 transtient 来说,相当于把对象生命周期管理交给了容器,所以你就不要管了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2229 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 16:10 · PVG 00:10 · LAX 08:10 · JFK 11:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.