我试图了解Autofac IOC的生命周期范围,并且有以下问题。
假设我们有课:
public class TestMemLeak
{
SomeDisposableContext cn;
public TestMemLeak(SomeDisposableContext context)
{
cn = context;
}
}
注入(inject)的依赖项SomeDisposableContext在其中实现IDisposable。
在MVC应用程序中,如果将SomeDisposableContext注册为InstancePerDependency(默认选项),则在解决TestMemLeak对象时出现内存泄漏。如果我将其注册为InstancePerRequest或InstancePerLifetimeScope,则泄漏消失了。
我不明白为什么InstancePerLifetimeScope修复泄漏。我的理解是,如果我们从根目录解析依赖关系,那么InstancePerLifetimeScope的行为应与InstancePerDependency相同,并且解决问题的方法是将ILifetimeScope传递给TestMemLeak类,并使用生存期范围解决依赖关系。为什么这个假设是错误的?在MVC应用场景中InstancePerRequest和InstancePerLifetimeScope有什么区别(除了InstancePerRequest会寻找特定的“httpRequest”生存期范围)?我什么时候应该使用InstancePerRequest?如果有人可以特别从内存泄漏的角度来解释这一点,那就太好了。
最佳答案
如documentation中所述,InstancePerLifetimeScope
适用于嵌套的解析。因此,这意味着在您的情况下,为您的HTTP请求实例化了一个对象,并注入(inject)了其依赖项,并且它们都在同一作用域中解析。这基本上是通过Autofac MVC集成来完成的,它被称为带有HTTP作用域标记的BeginLifetimeScope
。
如果您的依赖关系将在其他地方实例化,而不是在嵌套的分辨率3内,则它将超出生命周期范围,并且不会被处置。InstancePerRequest
不过不过是带有预定义标签常量InstancePerMatchingLifetimeScope
的MatchingScopeLifetimeTags.RequestLifetimeScopeTag
。因此,不需要在嵌套的生命周期作用域解析中实例化您的依赖关系,只要打开具有此标签的作用域就可以将实例附加到该作用域了。
关于asp.net-mvc - Autofac:MVC应用程序中的InstancePerRequest和InstancePerLifetimeScope有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38394509/