链式依赖注入中的生命周期
Lifetime in chained Dependency Injection
在 .NET Core 中,可以使用三种不同的生命周期:Transient
、Scoped
和 Singleton
.
假设我有以下依赖注入服务链:
Service A
> Service B
> Service C
,
意味着 Service A
注入了 Service B
(例如 Service A
取决于 Service B
)并且 Service B
注入了 Service C
。
现在考虑 Service B
有 Singleton
生命周期,Service C
有 Transient
生命周期。因为 Service B
是一个 Singleton
,它只创建一次。 Service C
是 Transient
,但是因为 Service B
是 Singleton
,所以 Service C
也只创建了一次。
这个论证是否正确,那么我为Service C
设置的Transient
生命周期是否没有意义?还是我在这里想错了?
您在这里描述的是一个称为 Captive Dependency 的常见问题。服务 C 成为俘虏,因为它的消费者有更长的生命周期。
这个问题很普遍,是使用依赖注入和 DI 容器的应用程序中常见的错误来源。当应用程序增长时,这些问题很容易被发现而不被发现。根据经验,我可以看出将错误追溯到此类错误配置可能会花费很多时间。
不幸的是,.NET Core 的 built-in 容器无法检测和防止此类错误。其他一些更成熟的 .NET DI 库实际上具有这些功能,它们可以检测并防止这些类型的错误配置。
在 .NET Core 中,可以使用三种不同的生命周期:Transient
、Scoped
和 Singleton
.
假设我有以下依赖注入服务链:
Service A
> Service B
> Service C
,
意味着 Service A
注入了 Service B
(例如 Service A
取决于 Service B
)并且 Service B
注入了 Service C
。
现在考虑 Service B
有 Singleton
生命周期,Service C
有 Transient
生命周期。因为 Service B
是一个 Singleton
,它只创建一次。 Service C
是 Transient
,但是因为 Service B
是 Singleton
,所以 Service C
也只创建了一次。
这个论证是否正确,那么我为Service C
设置的Transient
生命周期是否没有意义?还是我在这里想错了?
您在这里描述的是一个称为 Captive Dependency 的常见问题。服务 C 成为俘虏,因为它的消费者有更长的生命周期。
这个问题很普遍,是使用依赖注入和 DI 容器的应用程序中常见的错误来源。当应用程序增长时,这些问题很容易被发现而不被发现。根据经验,我可以看出将错误追溯到此类错误配置可能会花费很多时间。
不幸的是,.NET Core 的 built-in 容器无法检测和防止此类错误。其他一些更成熟的 .NET DI 库实际上具有这些功能,它们可以检测并防止这些类型的错误配置。