我试图了解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不过不过是带有预定义标签常量InstancePerMatchingLifetimeScopeMatchingScopeLifetimeTags.RequestLifetimeScopeTag。因此,不需要在嵌套的生命周期作用域解析中实例化您的依赖关系,只要打开具有此标签的作用域就可以将实例附加到该作用域了。

关于asp.net-mvc - Autofac:MVC应用程序中的InstancePerRequest和InstancePerLifetimeScope有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38394509/

10-10 22:48