2011-03-28 62 views
0

給出兩個A和B類,其中B依賴於A(注入的構造函數); B在基礎容器中被註冊爲SingleInstance,並且它被構建。 A在MultiTenantContainer中作爲SingleInstance註冊,根據tenantId而不同。Autofac:具有多租戶依賴性的單實例對象

問題1:將

Resolve<B>() 

認識到B還必須tenantId有什麼不同?

問題2:相同,但A被登記爲壽命範圍的多租戶容器內和B取決於

Func<Owned<A>>. 

更新:閉合!

這是一個「我想要的確實是想要的......」的情況,因爲我的初學者對語義缺乏理解;具體而言,我需要在租戶生命週期範圍內建立/共享跨所有分辨率的實例,該實例不存在。得到了一些指導,在問題#318上提交了一個補丁,它在變更集752中被拉到了主幹上,我們很高興去!現在,上面的問題將如下:

給定兩個A和B類,其中B依賴於A(構造函數注入); B在基礎容器中註冊爲InstancePerTenant,並且它已構建。 A被登記在MultiTenantContainer作爲InstancePerTenant,在tenantId不同...

和回答這兩個問題現在是「是」。

感謝特拉維斯和尼克的幫助和維護這個偉大的工具。

回答

0

如果我正確理解你的例子,那麼這兩個答案都是「否」。

Autofac可防止任何長期存在的實例獲得對較短壽命實例的引用。

雖然這可能意味着在這裏和那裏重新思考設計,以我的經驗,這使得更多的可預測的行爲。

希望這會有所幫助!

尼克

(順便說一句,如果你需要,你可以考慮創建與所描述的混凝土構件的另一個問題的任何具體情況的一些輸入。)

+0

感謝。我開始仔細閱讀資料來了解這一點,而且很快就會明白,這一切都是關於生命的。我很好奇你提到的「保護」。不「擁有」的實例繞過嗎? – 2011-03-29 04:10:42

+0

重讀你的第二個方案,我不是你的意思是由一個昭然若揭 - 在多租戶方面是否仍然參與了第二個方案......但是,是的,你說得對'Owned'改變規則,但它可能會以你所期望的方式出現。這裏的大圖的一些更多細節可能會有所幫助。乾杯! – 2011-03-29 10:47:24

+0

我是新來Autofac和我的問題是獲得這種工具本身,而不是它的應用程序的瞭解,所以抽象的格式是一個更適合。無論如何,它看起來像是一個非啓動器,因爲MTC通過使用'BeginLifetimeScope(Action )'在子生命週期範圍內註冊租戶特定組件來操作。當只在MTC(子生存期範圍)中註冊「A」時,任何試圖解析「B」(在根上註冊)的嘗試都將導致「DependencyResolutionException」。 – 2011-03-30 17:11:40