我有一個內存泄漏問題,我找不到一個插件。它適用於桌面應用程序,而不是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個內核。
有沒有什麼辦法一個類可以有一個成員,並釋放該成員之前,它被垃圾收集?
OK。我會做一兩個實驗來看內核是不是罪魁禍首。好建議。我將用一個消除過程來弄清楚。 – onefootswill
你說得很對。我很高興遇到這種情況,因爲我對可達物體的理解與你的解釋一致。所以我很困惑,因爲我的猜想是內核應該受到責備。有一條漫長而複雜的道路讓這個物體保持活力。它出現在某個地方,我試圖變得有點幻想並被抓住。謝謝。 – onefootswill