链式依赖注入的生命周期

时间:2017-01-19 13:28:23

标签: dependency-injection asp.net-core singleton lifetime transient

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

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

Service A> Service B> Service C

表示Service A已注入Service B(例如Service A取决于Service B)而Service B已注入Service C

现在考虑Service B生命周期为SingletonService C生命周期为Transient。由于Service BSingleton,因此仅创建一次。 Service CTransient,但由于Service BSingletonService C仍然只创建一次。

这个论证是否正确,因此我为Transient设定的Service C生命周期没有意义吗?或者我在这里错误思考?

1 个答案:

答案 0 :(得分:2)

您在此处描述的是一个常见问题,称为Captive Dependency。服务C变得俘虏,因为其消费者的寿命更长。

此问题很普遍,是使用依赖注入和DI容器的应用程序中的常见错误来源。当应用程序增长时,这些问题很容易在未检测到的情况下滑落。根据经验,我可以看出,将错误追溯到这种错误配置可能需要花费很多时间。

不幸的是,.NET Core的内置容器无法检测并防止出现这类错误。用于.NET的其他一些更成熟的DI库实际上具有这些功能,可以检测并防止这些错误配置。