下載app免費領取會員
使用MVVMlight創(chuàng)建一個項目以后,MainViewModel的構造函數(shù)是這樣的:
public MainViewModel(IDataService dataService)
{
_dataService = dataService;
_dataService.GetData(
(item, error) =>
{
if (error != null)
{
// Report error here
return;
}
WelcomeTitle = item.Title;
});
}
它依賴于一個實現(xiàn)了IDataService 的類,但是在使用的時候,代碼確實這樣的:
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
如果我們按照一般邏輯來寫,應該是寫成這樣:
public MainViewModel Main
{
get
{
IDataService service = new DataService();//這是一個實現(xiàn)了IDataService 的類
return new MainViewModel(service);
//return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
那這是怎么回事呢?
在使用這個ViewModel之前SimpleIoc.Default還做了兩件事:
SimpleIoc.Default.Register<IDataService, DataService>();//這個就應該是所謂的依賴注入,DataService是要創(chuàng)建MainViewModel需要的一個參數(shù),一個依賴項
SimpleIoc.Default.Register<MainViewModel>();
而ServiceLocator.Current.GetInstance<MainViewModel>();
所做的是使用MainViewModel的 ConstructorInfo來創(chuàng)建(第一次Get的時候創(chuàng)建),而調用 ConstructorInfo的時候,我們會發(fā)現(xiàn)它需要一個參數(shù),而這個參數(shù)的class
的構造函數(shù)是沒有參數(shù)的,應為我們之前做過Register操作,所以可以通過Register時候傳的接口和類,來找到這個類,并使用反射來創(chuàng)建一個對象供MainViewModel的
ConstructorInfo來使用,而創(chuàng)建好的MainViewModel會保存在SimpleIoc.Default里,下次使用就不必重新創(chuàng)建(這個應該是服務定位器模式)
本文版權歸腿腿教學網及原創(chuàng)作者所有,未經授權,謝絕轉載。
上一篇:二次開發(fā)教程:MVVMLight的Messenger
推薦專題