2

我熟悉MVVM Light工具包的ViewModelBase,Message,但不熟悉ViewModelLocator。在我的應用程序中有Singleton ViewModel,如PrinterViewModel。註冊就像MVVM Light ViewModelLocator:如何註冊Singleton ViewModel?

SimpleIoc.Default.Register<IPrinter,PrinterViewModel>(); 

調試時,錯誤是一樣的東西「不能登記:未找到公共構造」。

所以2個問題:

  1. 是不是壞主意,有辛格爾頓視圖模型?
  2. 如何註冊Singleton ViewModel,因爲我沒有發現任何重載爲特定接口傳遞實例?

回答

4

1)作爲一般的經驗法則,是的。注射框架的任務是確定範圍。您可能需要一個數據庫存儲庫類(比如說),它需要WPF構建中的每個表單範圍(所以用戶可以取消編輯),Web構建中的每個請求範圍和命令行工具中的單例範圍範圍。無論是班級本身還是任何消費者都不應該知道該物體已經提供了哪些範圍。

2)一個簡單的(也不是很好)解決方案就是將單例實例添加到ViewModelLocator中,並始終返回該實例。另一個是隻需調用GetInstance()而不需要密鑰並依賴於懶惰創建。雖然我並不是SimpleIoC的粉絲,但它也有點簡單我喜歡。嘗試採取一看像Ninject功能更全面的框架,你會發現他們很多在用法如更加靈活和流暢:

Bind<IPrinter>().To<PrinterViewModel>().InSingletonScope(); 
1

我有,我希望通過自己註冊一個單身的情況下, ,因爲我需要給對象構造函數一個參數。

我那麼做註冊的單一實例:

SimpleIoc.Default.Register<IInterface>(() => new ImplementationClass(param)); 

對象將構建只有一次,第一次這條線被稱爲:

ServiceLocator.Current.GetInstance<IInterface>();