2012-03-06 89 views
5

我使用Castle-Windsor作爲Caliburn-Micro Silverlight應用程序中的容器。我的ViewModel對象在調用WCF服務和其他一些東西時相當矮胖。因此,當窗口關閉時,我想調用container.Release(viewModel),以便Castle可以管理整個停用/處置過程,尊重配置的各種生命週期(如this post中概述的)。在Caliburn Micro和Castle Windsor中處理ViewModels

在我AppBootstrapper我已經覆蓋的GetInstance如下:

protected override object GetInstance(Type serviceType, string key) 
{ 
    if (string.IsNullOrEmpty(key)) return container.Resolve(serviceType); 
    return container.Resolve(key, serviceType); 
} 

但我很努力拿出調用container.Release(viewModel)的乾淨/優雅的方式。似乎沒有任何鉤子可用於此。

在Caliburn Micro應用程序中釋放ViewModelLocator返回的ViewModel對象的最簡單方法是什麼?

回答

0

您希望爲每種虛擬機類型生命週期在這裏都會產生影響,因此對於您提供的上下文沒有真正的正確答案。

CM的Screen基類爲您提供protected virtual void OnDeactivate(bool close);這是一個很好的開始。對於您的重量級虛擬機,您應該重寫此方法,並且如果虛擬機正在由close參數指示關閉,則釋放需要處理的所有資源(WCF通道等),這將包括處置資源(如果IDisposable相關)和還要斷開對它的任何引用,以便它可以通過GC進行清理。

我不使用城堡,所以我不能幫你配置生命週期等。但如果你遵循上面的說法,你不會堅持任何重量。我假設在正確的生命週期配置下,Castle將清除任何舊的實例,如果沒有明確地致電Release,它將自行重新使用。

+0

非常感謝@Simon。我一直在探索OnDeactivate路線作爲一個掛鉤的地方。是的,如果你有一個具有長構造函數參數列表的虛擬機,Castle將滿足該構件的所有依賴關係。然後,當組件是Release()時,Castle將根據爲其中每個人配置的生活方式釋放所有依賴關係。這裏重要的是Vms本身不負責任何清理工作 - 這全是自動的。 – 2012-03-15 22:02:37

+0

將責任推給虛擬機本身可能會起作用,但這意味着虛擬機開始受到生命週期責任的污染,如果可能的話,我真的希望避免這些責任。理想情況下,釋放的責任應該承擔解決的責任 - 即在調用堆棧中,在引導程序或容器本身中更高...... – 2012-03-15 22:06:59

+0

是的,就像我說的那樣,作爲一個例子,如果您將VM類型配置爲「單次使用」的生命週期(任何在Castle中映射的內容),那麼當下一次請求該類型的實例時,容器應該釋放已使用過的實例,因爲它已經被使用過了......沒有明確的調用來釋放。 – 2012-03-15 22:09:08