2015-09-18 34 views
0

我有一個內存泄漏問題,我找不到一個插件。它適用於桌面應用程序,而不是web,因此對象的使用壽命比單個請求長。在介體模式實現中將Ninject注入處理器以實現對象分辨率

我想實現這個優秀的博客文章中描述的架構 - https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92

QueryProcessor類需要一個IOC容器,因爲它解決了當過程方法被調用的具體類型。我的實現看起來是這樣的:

public sealed class QueryProcessor : IQueryProcessor, IDisposable 
{ 
    private readonly IKernel _container; 
    private bool _disposed; 

    public QueryProcessor(IKernel container) 
    { 
     _container = container; 
    } 

    //[DebuggerStepThrough] 
    public TResult Process<TResult>(IQuery<TResult> query) 
    { 
     var handlerType = typeof(IQueryHandler<,>).MakeGenericType(query.GetType(), typeof(TResult)); 

     dynamic handler = (_container.Target as IKernel).Get(handlerType); 

     return handler.Handle((dynamic)query); 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

    private void Dispose(bool disposing) 
    { 
     if (disposing && !_disposed) 
     { 
      // dispose container ??? 
      _disposed = true; 
     }    
    } 
} 

我遇到的問題是,如果我注入了Ninject內核,這意味着QueryProcessor類時,它超出範圍不會被垃圾回收,因爲它保持參考內核。

如果我仔細研究它,並在內核中調用Dispose,我已經殺死了我的內核,並且沒有更多的應用程序的DI。

如果我創建一個單獨的內核並注入它的QueryProcessor的每個實例,然後Ninject儘快夾頭一個例外,因爲它試圖解決一個具體類型 - 「錯誤加載Ninject組件ICACHE」。顯然Ninject不喜歡超過1個內核。

有沒有什麼辦法一個類可以有一個成員,並釋放該成員之前,它被垃圾收集?

回答

2

我遇到的問題是,如果我注入Ninject內核,它 意味着QueryProcessor類沒有得到垃圾回收時 超出範圍,因爲它維持到內核的引用。

當沒有引用此對象時,此對象有資格進行垃圾回收。這個對象引用的其他對象並不重要。所以也許你在錯誤的地方尋找內存泄漏。我看到你沒有註冊任何IKernel的事件(這會創建一個從IKernels委託給你的對象的引用),所以如果沒有其他引用你的QueryProcessor它應該被垃圾回收。 OK。

+0

OK。我會做一兩個實驗來看內核是不是罪魁禍首。好建議。我將用一個消除過程來弄清楚。 – onefootswill

+0

你說得很對。我很高興遇到這種情況,因爲我對可達物體的理解與你的解釋一致。所以我很困惑,因爲我的猜想是內核應該受到責備。有一條漫長而複雜的道路讓這個物體保持活力。它出現在某個地方,我試圖變得有點幻想並被抓住。謝謝。 – onefootswill