在.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
仍然只创建一次。
这个论证是否正确,因此我为Transient
设定的Service C
生命周期没有意义吗?或者我在这里错误思考?
答案 0 :(得分:2)
您在此处描述的是一个常见问题,称为Captive Dependency。服务C变得俘虏,因为其消费者的寿命更长。
此问题很普遍,是使用依赖注入和DI容器的应用程序中的常见错误来源。当应用程序增长时,这些问题很容易在未检测到的情况下滑落。根据经验,我可以看出,将错误追溯到这种错误配置可能需要花费很多时间。
不幸的是,.NET Core的内置容器无法检测并防止出现这类错误。用于.NET的其他一些更成熟的DI库实际上具有这些功能,可以检测并防止这些错误配置。