链式依赖注入中的生命周期

Lifetime in chained Dependency Injection

在 .NET Core 中,可以使用三种不同的生命周期:TransientScopedSingleton.

假设我有以下依赖注入服务链:

Service A > Service B > Service C,

意味着 Service A 注入了 Service B(例如 Service A 取决于 Service B)并且 Service B 注入了 Service C

现在考虑 Service BSingleton 生命周期,Service CTransient 生命周期。因为 Service B 是一个 Singleton,它只创建一次。 Service CTransient,但是因为 Service BSingleton,所以 Service C 也只创建了一次。

这个论证是否正确,那么我为Service C设置的Transient生命周期是否没有意义?还是我在这里想错了?

您在这里描述的是一个称为 Captive Dependency 的常见问题。服务 C 成为俘虏,因为它的消费者有更长的生命周期。

这个问题很普遍,是使用依赖注入和 DI 容器的应用程序中常见的错误来源。当应用程序增长时,这些问题很容易被发现而不被发现。根据经验,我可以看出将错误追溯到此类错误配置可能会花费很多时间。

不幸的是,.NET Core 的 built-in 容器无法检测和防止此类错误。其他一些更成熟的 .NET DI 库实际上具有这些功能,它们可以检测并防止这些类型的错误配置。