Autofac:MVC 应用程序中的 InstancePerRequest 和 InstancePerLifetimeScope 有什么区别

Autofac: What is the difference between InstancePerRequest and InstancePerLifetimeScope in an MVC app

我想了解 Autofac IOC 中的生命周期范围并有以下问题。

假设我们有 class:

public class TestMemLeak
    {
        SomeDisposableContext cn;
        public TestMemLeak(SomeDisposableContext context)
        {
            cn = context;
        }
    } 

其中注入的依赖项 SomeDisposableContext 实现了 IDisposable。

在 MVC 应用程序中,如果 SomeDisposableContext 注册为 InstancePerDependency(默认选项),我在解析 TestMemLeak 对象时会发生内存泄漏。如果我将其注册为 InstancePerRequest 或 InstancePerLifetimeScope,泄漏就会消失。

我不明白为什么 InstancePerLifetimeScope 会修复漏洞。我的理解是,如果我们从根解析依赖关系,那么 InstancePerLifetimeScope 的行为方式应该与 InstancePerDependency 相同,解决问题的方法是将 ILifetimeScope 传递给 TestMemLeak class 并使用生命周期范围解析依赖关系。为什么这个假设是错误的,在 MVC 应用程序场景中 InstancePerRequest 和 InstancePerLifetimeScope 之间有什么区别(除了 InstancePerRequest 寻找特定的 'httpRequest' 生命周期范围)?我什么时候应该使用 InstancePerRequest?如果有人能特别从内存泄漏的角度解释这一点,那就太好了。

documentation 中所述,InstancePerLifetimeScope 适用于嵌套解析。因此,这意味着在您的情况下,为您的 HTTP 请求实例化了一个对象,并注入了它的依赖项,并且它们都在同一范围内解析。这基本上是通过 Autofac MVC 集成完成的,它被称为带有 HTTP 范围标记的 BeginLifetimeScope

如果您的依赖项将在其他地方实例化,而不是在嵌套解析三内,它将超出生命周期范围并且不会被释放。

然而,

InstancePerRequest 只不过是带有预定义标记常量 MatchingScopeLifetimeTags.RequestLifetimeScopeTagInstancePerMatchingLifetimeScope。因此,您的依赖项不需要在嵌套的生命周期范围解析中实例化,打开带有此标记的范围以获得附加到此范围的实例就足够了。