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

时间:2016-07-15 11:01:26

标签: asp.net-mvc memory-leaks dependency-injection autofac ioc-container

我正在尝试了解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?如果有人能够从内存泄漏的角度解释这一点,那就太好了。

1 个答案:

答案 0 :(得分:2)

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

如果您的依赖项将在其他地方实例化,而不是在嵌套的解决方案3中,它将在生命周期范围之外,并且不会被处理。

然而,

InstancePerRequest只不过是带有预定义标记常量InstancePerMatchingLifetimeScope的{​​{1}}。因此,您的依赖关系不需要在嵌套的生命周期范围解析内实例化,只要打开具有此标记的范围就可以将实例附加到此范围。