2012-05-01 55 views
4

我有一個Winforms菜單項,可以在點擊時調出一個WPF表單。 WPF表格使用Caliburn Micro,由Autofac引導。如何處置與Caliburn Micro一起使用的Autofac容器

最近我發現Caliburn引導程序解決了根Autofac容器的依賴問題。因此,這些依賴關係(例如,具有1000個要綁定到網格的數據項的視圖模型)永遠不會被處置。

我想使用一個Autofac lifetimescope容器來管理處理,但是,我不知道如何用Caliburn來做到這一點。最初,我想爲每個打開的WPF表單實例化一個Caliburn引導程序(帶有自己的Autofac Lifetimecope容器)。然後,在放置表格時,可以放置引導器(以及帶有它的壽命鏡容器)。

但是,從看Caliburn源代碼看來,應該只爲整個應用程序創建一個引導程序。這是因爲實例化引導程序似乎分配了靜態字段來處理UI編組(也許我可能沒有看到其他的東西)。

有沒有人有關於WPF表單關閉時如何處理依賴關係的建議/建議?

+0

我問了一個與Castle相關的問題。 http://stackoverflow.com/q/9583760/246811。至今還沒有一個可行的答案。 –

+0

在問我的問題之前,我確實看到了您的帖子。像你一樣,我正在尋找一種方法來做到這一點,而不會污染虛擬機。此外,我不知道爲什麼沒有關於這個在線的更多信息 - 這似乎是使用Caliburn時的一個相當大的問題(至少對於Autofac和Castle,這是兩種流行的DI框架)。 –

+0

同意。生命週期問題對VM的污染並不是我可以忍受的。 –

回答

1

我目前使用以下命令來釋放從Castle中解析出來的視圖模型(直到更好的東西出現!)。我不熟悉AutoFac,但也許這種方法可能有用。在你的引導程序中:

protected override object GetInstance(Type serviceType, string key) 
{ 
     // Get the instance from the container 
     ... 

     // If it's activatable, monitor it so we can release when closed. 
     IDeactivate activatable = result as IDeactivate; 
     if (activatable != null) 
     { 
      activatable.Deactivated += activatable_Deactivated; 
     } 
     return result; 
} 

    void activatable_Deactivated(object sender, DeactivationEventArgs e) 
    { 
     if (e.WasClosed) 
     { 
      ((IDeactivate)sender).Deactivated -= activatable_Deactivated; 
      container.Release(sender); // or whatever AutoFac equivalent is... 
     } 
    } 
+1

感謝分享。不幸的是,我不確定這是否適用於Autofac。 Autofac的生命週期管理方法主要圍繞創建可在工作單元完成時處置的子容器。這意味着引導程序需要知道哪個子容器需要解析依賴關係,以及要處理哪個子容器。我還沒有檢查Autofac是否支持根容器中的container.Release樣式方法。 –