通过 .UsingFactoryMethod 解决但未使用内核明确解决的瞬态依赖项的生命周期是多少?

What is the lifetime of a transient dependency resolved via .UsingFactoryMethod but not explicitly resolved using the kernel?

我有以下 class 公开了 public 工厂方法而不是 public 构造函数:

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());

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

当依赖于它的对象超出范围时,容器是否会处理这种依赖关系,或者这种依赖关系是否会因无法处理而导致所有内容都存在?

关注的是静态方法吗?如果是这样,那应该不会导致标记未使用的对象进行处置的问题。我不确定我是否会使用该模式,但我没有在您的 post 中看到该模式的全部动机,所以我无法判断。

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

如果您看到内存使用量增加并担心内存泄漏,从而提出这个问题,您可以深入挖掘,但更有可能您只是了解 .NET 的运行方式。当需要内存时会发生处置,因此看到 .NET 似乎保留内存是正常的,就好像它是内存泄漏一样。在几乎所有情况下,我都调查了认为自己有内存泄漏的客户,这只是 .NET 在需要内存之前不处理对象(默认行为)。

如果您发现潜在问题,可以使用多种方法来探测 .NET 中的内存泄漏。我建议使用工具而不是通过 dumpheap 挖掘,但某些工具的定价在某些情况下可能会让人望而却步。如果您只是需要安心,您没有造成内存泄漏,您可以使用各种产品的试用版。

如果出现以下情况,它将被处理掉:

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

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

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