我使用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對象的最簡單方法是什麼?
非常感謝@Simon。我一直在探索OnDeactivate路線作爲一個掛鉤的地方。是的,如果你有一個具有長構造函數參數列表的虛擬機,Castle將滿足該構件的所有依賴關係。然後,當組件是Release()時,Castle將根據爲其中每個人配置的生活方式釋放所有依賴關係。這裏重要的是Vms本身不負責任何清理工作 - 這全是自動的。 – 2012-03-15 22:02:37
將責任推給虛擬機本身可能會起作用,但這意味着虛擬機開始受到生命週期責任的污染,如果可能的話,我真的希望避免這些責任。理想情況下,釋放的責任應該承擔解決的責任 - 即在調用堆棧中,在引導程序或容器本身中更高...... – 2012-03-15 22:06:59
是的,就像我說的那樣,作爲一個例子,如果您將VM類型配置爲「單次使用」的生命週期(任何在Castle中映射的內容),那麼當下一次請求該類型的實例時,容器應該釋放已使用過的實例,因爲它已經被使用過了......沒有明確的調用來釋放。 – 2012-03-15 22:09:08