gpt4 book ai didi

asp.net-mvc - Autofac:MVC 应用程序中 InstancePerRequest 和 InstancePerLifetimeScope 之间有什么区别

转载 作者:行者123 更新时间:2023-12-02 07:49:27 25 4
gpt4 key购买 nike

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

假设我们有类(class):

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

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

然而,

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com