6

我正在使用MVC體系結構和IOC容器的WPF應用程序。目前,我正在醞釀涉及某些容器提供組件的範圍和壽命的設計問題。這是情況。如何爲IoC注入組件實現每視圖生命週期

我將泛泛地說一些不正確的說法,即IOC容器支持兩個組件生命週期,單例和瞬態。但是我們需要的是某些組件的中間立場。

考慮一個顯示網格中記錄列表的視圖。當用戶點擊一條記錄時,將打開一個新視圖以顯示記錄詳細信息並允許編輯。用戶可以打開許多這樣的視圖,每個顯示不同的記錄。每個視圖都有自己的模型和控制器。

在給定的模型 - 視圖 - 控制器集的上下文中,存在一些組件,例如瞬態和延遲注入的對話框。也就是說,我們每次需要顯示一個新實例時都需要一個新實例,並且由於大多數瞬態只在用戶採取特定操作時才需要,因此我們最初只注入一個工廠代表。然後根據需要調用委託來執行實際的依賴關係解析。

除了模型,視圖和控制器之外,還有一大堆其他組件,我們希望每個m-v-c組有一個實例。例如,我們正在實現NHibernate對話模式,該模式需要在視圖打開時打開會話並保持打開狀態直至關閉。同樣,每個集合都需要自己的共享事件代理,並可能包含一些「其他事物」。如果所有這些依賴關係在創建視圖時得到解決,那麼這不會成爲問題。我們可以宣佈它們都是暫時的,並且可以用它來完成。

但是,其中一些懶惰解決的依賴關係本身依賴於模型,控制器或「其他事物」。所以問題是,在解析惰性依賴項時,委託後面的容器需要注入每個依賴項的正確實例。這當然意味着委託本身與m-v-c集合有某種聯繫,但如果可以解決更大的問題,這應該不是問題。

上面我說過,我簡單列出了支持的生命週期列表。大多數容器支持一些中間生命週期,例如每個線程或預先請求,這允許在概念上類似於我們正在尋找的範圍。但這些不適用於交互式UI場景。情況並非如此,每個視圖都在自己的線程上,或者在爲方案範圍提供基礎的其他方便的上下文中。

因此,我的問題是,使用IOC容器實現每個視圖(或每個任意上下文)組件生命週期的最佳方式是什麼。我們現在的容器是Unity,但我們已經抽出了自己的足夠好,我們可以切換沒有太多的困難。因此,如果這更容易在另一個容器中實現,或者由另一個容器實現,我們可以考慮切換。

回答

4

您描述的模式是工作單元。您說得很對,因爲它很容易爲Web請求定義,但在說明它不適用於交互式UI場景時不正確。該視圖本身是作用域範圍內 - 你知道,當你移動到它,遠離它,而這些都是在你分別創建和銷燬子容器點:

  1. 移動查看
  2. 創建子對於視圖容器
  3. 從子容器
  4. 解決視圖實例
  5. 做的工作
  6. 銷燬子容器
  7. 移動遠離視線
+0

我認爲這種可能性,但是,我不清楚子容器和組件生命週期之間的關係。具體來說,不同的容器表現出不同的尊重。 Castle容器在同一層次中的所有容器上使用相同的單例實例。 Unity的ContainerControlledLifetimeManager,它的名字意味着相反的意思,即每個子容器都獲得一組全部的容器控制組件。需要另一個終身管理者,在中間...... – 2010-12-01 16:17:19