2015-11-02 41 views
1

我有以下的类,它暴露了一个公共的工厂方法,而不是一个公共构造:通过.UsingFactoryMethod解决的瞬态依赖性的生命周期是什么,但没有使用内核明确解决?

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

如果它将被布置:

  • 它实现IDisposable,其目前不,
  • 的组合物,根调用Container.Release()为造成SomeDependency被实例化的组件。

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

如果你指的是垃圾收集,而不是出售,那么你当前的实现可能工作确定与对象变得可用于GC当它超出范围。在大多数情况下,不实现IDisposable短暂组件将不会被集装箱跟踪,但它可以依靠你正在使用你的货柜里有什么其他设施。因此,它始终是最好的保证Release被调用。

1

静态方法是否值得关注?如果是这样,那不应该在标记未使用的物体进行处理时引起问题。我不确定我会使用这个模式,但是我没有看到你的帖子中模式的全部动机,所以我不能判断。

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

如果您看到内存使用增长并担心内存泄漏,并因此提出问题,您可以深入挖掘,但更有可能您只是看到.NET如何运行。因为内存需要处理,所以正常情况下,看起来似乎是内存泄漏。在几乎所有情况下,我都为那些认为自己有内存泄漏的客户进行了调查,只是在内存需要(缺省行为)之前,.NET才会处理对象。

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

+0

在图案A小细节:组件旨在是公开可用,但没有公开施工的由于构建它需要不兼容的类型。通过使用静态工厂方法可以获得对象的实例。类型化的工厂不工作,因为我试图保持构造函数为私有。因为我希望能够以分离使用DI具有消耗代码调用静态方法变得有问题的对象。最终,这归结于容器的实现细节。 – moarboilerplate