通过.UsingFactoryMethod解析但未使用内核显式解析的瞬态依赖关系的生命周期是多少?

时间:2015-11-02 15:06:59

标签: c# castle-windsor castle

我有以下类暴露公共工厂方法而不是公共构造函数:

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

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

当依赖于它的对象超出范围时,容器是否会处置此依赖关系,或者这种依赖关系是否会被丢弃并使一切都停留在一起?

2 个答案:

答案 0 :(得分:2)

如果出现以下情况,将予以处理:

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

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

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

答案 1 :(得分:1)

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

如果这是一个Singleton(通过静态方法提供的静态变量),你就不会处理,但这就是模式的意图。

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

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