2011-05-09 89 views
2

我有POCO對象,通過在存儲庫中查找ID來引用對方。我不希望對象之間有強烈的引用,因爲存儲庫具有可能驅逐對象的緩存策略。其他引用它們的對象應該通過存儲庫重新加載它們。我使用AutoFac作爲我的IoC容器。弱參考與Autofac解決?

很簡單的例子 - Region對象引用的貨幣對象:

class Region 
{ 
    ... 
    public Currency GetCurrency() 
    { 
     ... Get the right Currency object 
    } 
    ... 
} 

我一直在兩個方面嘗試做到這一點。首先是要求AutoFac每次解析貨幣存儲庫,以便我可以調用Find(id)。

第二個是WeakReference,我檢查.IsAlive,看看我是否可以返回.Target,或者如果我需要解決存儲庫並調用Find,併爲我所得到的WeakReference做一個WeakReference。

我一直在研究WeakReference施加的小額開銷,但我確信如何比較每次要求AutoFac進行解析。

想法?

編輯:存儲庫需要花費任何時間/精力來回答.find - 我更感興趣的是哪些代碼更昂貴,WeakReference的開銷或AutoFac分辨率。

回答

4

我只是想知道哪個更 開銷 - WeakReference的或爲庫重複 國際奧委會的決議。

這很難回答,因爲兩者完全不同。開銷也很大程度上取決於您如何使用autofac註冊/解析組件。

例如:您是否計劃註冊爲InstancePerLifetimeScope(),並獲取Lazy參考?

由於弱引用,你持有一個對象的引用,但告訴運行時它可以收集它 - 你會處理這個。

使用autofac,您要求容器構造並提供實例,注入依賴關係,以及(可能)管理生命週期範圍和處置。因此,就開銷而言 - 這兩個關注點相交的小區域(獲取某個事物的實例)完全取決於您註冊和解析組件的方式,但是我沒有看到任何代碼路徑,而WeakReference不會在這個位置t稍微(非常輕微)少開銷。儘管WR有一些運行時間的開銷 - 所以很難直接比較。

+1

換句話說,它可能並不重要,但如果你真的在乎嘗試兩種選擇並比較結果 – 2011-05-09 18:17:59

2

去數據庫總是比處理弱引用要花費更多。對於這個貨幣的特例,只有少數幾個對象,所以最好通過將它們全部留在內存中來實現,但對於較大的數據集,2層方法(弱引用+存儲庫)似乎是合理的。

+0

感謝羅伯特,但要清楚,存儲庫可能甚至不需要去數據庫來回答查找。我只是想知道哪些是更多的開銷 - WeakReference或重複的IoC解決方案的存儲庫。 – n8wrl 2011-05-09 15:11:28