2015-11-02 43 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