2013-10-13 111 views
1

我在寫一個Ninject擴展,並且對Ninject的內部有一些疑問。以下是真的嗎?Ninject上下文唯一性

  1. 看起來好像每個激活的實例都有與之相關的不同的IContext。

  2. 上下文無法回收。一旦創建了與上下文相關聯的對象(即Bind<IObject>.To...中的IObject),則該上下文不能被重新用於創建另一個對象。下一次解析綁定時,它將使用新創建的上下文。

+1

關於2:我認爲你是對的,但是,考慮一個上下文可能有一個父上下文,並且在解析「子」時重用父上下文的參數(構造函數參數等)。另外,當使用ContextPreservation擴展時,當工廠(可以像Func 一樣簡單)在稍後時間創建一個新對象時,將使用原始上下文作爲父上下文。 – BatteryBackupUnit

回答

2

上下文爲您提供當前激活對象的上下文信息。例如。什麼類型,它將被注入哪裏......。

這個信息對於每個激活的對象都是不同的,所以是每個激活的對象都會創建一個新的實例。此外,上下文在對象被激活之前創建。

+0

我正在編寫一個類似於你的Dependency Creation插件的擴展(我使用了很多相同的代碼)。區別在於它將類型排隊以激活,直到對象解析爲解析根。它絕對是一項正在進行的工作。大部分邏輯位於「CreateOnActivationActivationStrategy.cs」中。 https://github.com/orourkedd/ninject.extensions.createonactivation – orourkedd

+0

你正在這樣做的複雜。你不必跟蹤瞬態。對於每個激活的實例,OnActivation只會被調用一次。獲取像https://github.com/ninject/ninject.extensions.namedscope/blob/master/src/Ninject.Extensions.NamedScope/NamedScopeExtensionMethods.cs InCallScope這樣的根。將所有非root用戶的指令添加到字典中(使用lock或ConcurrentDictionary!)解決在激活根(list.Distinct())時多次添加相同指令的問題。 –

+0

這個想法是排列所有的依賴關係的指令,直到激活根。我遇到的問題是,有時解決方案根目錄已經解決(在延遲加載的情況下)。在這種情況下,我必須確定一個對象的祖先是否已經被激活。這就是瞬態緩存的用途。我也不想爲依賴項使用特殊的作用域。 – orourkedd