通过.UsingFactoryMethod解析但未使用内核显式解析的瞬态依赖项的生存期是多少

本文关键字:依赖 多少 生存期 UsingFactoryMethod 未使用 内核 核显 通过 | 更新日期: 2023-09-27 18:20:11

我有以下类,它公开了一个公共工厂方法而不是公共构造函数:

public class SomeDependency
{
    private readonly string _someValue;
    private SomeDependency(string someValue)
    {
        _someValue = someValue;
    }
    public static SomeDependency CreateSomeDependency(string someValue)
    {
        return new SomeDependency(someValue);
    }
}

我在容器中配置它,使其具有短暂的生活方式,并通过静态方法创建:

Container.Register(Component.For<SomeDependency>()
    .UsingFactoryMethod(k => SomeDependency.CreateSomeDependency("a value"))
    .LifestyleTransient());

将此依赖项注入的所有组件也配置为瞬态组件。

当依赖它的对象超出范围时,容器会处理这个依赖项吗?还是这个依赖项无法处理并使所有内容都保留下来?

通过.UsingFactoryMethod解析但未使用内核显式解析的瞬态依赖项的生存期是多少

如果:

  • 它实现了IDisposable,而它目前没有,
  • 组合根调用导致SomeDependency实例化的组件的Container.Release()

不能简单地依赖超出范围的组件来触发处置。

如果您指的是垃圾收集而不是处理,那么您当前的实现可能可以正常工作,当对象超出范围时,它将可用于GC。在大多数情况下,容器不会跟踪不实现IDisposable的瞬态组件,但这可能取决于您在容器中使用的其他设施。因此,最好始终确保调用Release

关注的是静态方法吗?如果是这样的话,那么标记未使用的对象以进行处理就不会产生问题。我不确定我是否会使用这种模式,但我看不出你帖子中这种模式的全部动机,所以我无法判断。

如果这是一个Singleton(通过静态方法提供的静态变量),则不会进行处置,但这将是模式的意图。

如果您看到内存使用量增长,并担心内存泄漏,因此提出了这个问题,您可以更深入地了解,但更可能的是,您只是看到了.NET是如何运行的。在需要内存时会进行处理,所以看到.NET像内存泄漏一样抓住内存是很正常的。在我调查过的几乎每一个认为存在内存泄漏的客户端的案例中,都只是.NET在需要内存之前不处理对象(默认行为)。

如果你看到了一个潜在的问题,有一些方法可以探测.NET中的内存泄漏。我建议使用一个工具,而不是通过dumpmap进行挖掘,但在某些情况下,某些工具的定价可能会过高。如果你只是需要安心,没有造成内存泄漏,你可以使用各种产品的试用版。