我正在尝试了解Autofac IOC中的生命范围并提出以下问题。
假设我们有课程:
public class TestMemLeak
{
SomeDisposableContext cn;
public TestMemLeak(SomeDisposableContext context)
{
cn = context;
}
}
注入依赖项SomeDisposableContext实现IDisposable。
在MVC应用程序中,如果将SomeDisposableContext注册为InstancePerDependency(默认选项),则在解析TestMemLeak对象时会出现内存泄漏。如果我将其注册为InstancePerRequest或InstancePerLifetimeScope,泄漏就会消失。
我不明白为什么InstancePerLifetimeScope修复了泄漏。我的理解是,如果我们从root解析依赖,那么InstancePerLifetimeScope的行为应该与InstancePerDependency相同,问题的解决方案是将ILifetimeScope传递给TestMemLeak类并使用生命周期范围解决依赖关系。为什么这个假设是错误的,并且在MVC应用场景中InstancePerRequest和InstancePerLifetimeScope之间有什么区别(除了InstancePerRequest寻找特定的' httpRequest'生命周期范围)?我什么时候应该使用InstancePerRequest?如果有人能够从内存泄漏的角度解释这一点,那就太好了。
答案 0 :(得分:2)
如documentation中所述,InstancePerLifetimeScope
适用于嵌套转换。所以这意味着在你的情况下,一个对象被实例化为你的HTTP请求,并且它注入了它的依赖项,并且它们都在同一范围内被解析。这基本上是通过Autofac MVC集成完成的,它被称为BeginLifetimeScope
,带有HTTP范围标记。
如果您的依赖项将在其他地方实例化,而不是在嵌套的解决方案3中,它将在生命周期范围之外,并且不会被处理。
然而, InstancePerRequest
只不过是带有预定义标记常量InstancePerMatchingLifetimeScope
的{{1}}。因此,您的依赖关系不需要在嵌套的生命周期范围解析内实例化,只要打开具有此标记的范围就可以将实例附加到此范围。