gpt4 book ai didi

asp.net-mvc - 使用 IoC,Singleton 可以注入(inject)具有 transient 生命周期的对象吗?

转载 作者:行者123 更新时间:2023-12-04 15:24:34 27 4
gpt4 key购买 nike

我们有一个 ASP.NET MVC 应用程序,它使用 IoC 将服务引用注入(inject) Controller 并将存储库引用注入(inject)服务。

Controller 必须具有 transient 生命周期,因为它们必须根据请求进行实例化。但是,如果每个请求都更新整个 IoC 堆栈,那么这会产生一些开销。我们有比我想要的更多的依赖关系,一种选择是拥有更多的 Controller ,每个 Controller 在堆栈中的依赖关系更少。但是,暂且不说,我的问题是,如果作为单例注入(inject)的对象具有具有短暂生命周期的依赖项,那么这些依赖项是否会因为被单例所拥有而本质上被视为单例?

具体来说,如果我们有以下

RepositoryA(需要是临时的,因为当前设计在构造函数中注入(inject)了用户上下文)
服务A(单件)
Controller A( transient )

像这样实例化:

public ServiceA(IRepositoryA repo) {}
public ControllerA(IServiceA service) {}

RepositoryA 本质上会被实例化一次,因为 ServiceA 被实例化了一次吗?

我 99% 肯定答案是肯定的,但只是想确认我必须在这里进行的重构量。

此外,假设服务和存储库没有任何用户/请求特定的实例变量,作为一种设计方法,是否有任何理由不为它们使用单​​例生命周期?

最佳答案

if an object that is injected as a singleton has dependencies that have a transient lifetime, will those dependencies essentially be treated like singletons by virtue of being owned by the Singleton?



这是正确的。由于此类组件保留其依赖项(通过将其引用存储在私有(private)字段中),因此这些依赖项将与组件本身一样存在。换句话说,它们的生命周期被隐式提升为组件的生命周期(如果它们的生命周期更短)。

如果你有这个,你的 DI 配置肯定是错误的,迟早会出现这个错误。可能只在生产中,几乎从来没有在你的开发机器上:-S。

一般来说,容器管理的所有组件应该只依赖于生命周期等于或长于组件本身的抽象。

一些框架甚至有分析服务来检测这些类型的配置错误。尽管如此,在连接所有依赖项时应该非常小心。一般来说,尽可能将组件配置为 transient 是最安全的,因为 transient 组件允许包含任何生活方式的依赖项。拥有许多 transient 对象通常不会成为性能问题。每个 Web 请求构建一个相当大的对象图通常会足够快(否则尝试切换到 DI framework with a higher throughput )。

关于asp.net-mvc - 使用 IoC,Singleton 可以注入(inject)具有 transient 生命周期的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14059397/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com