下载app免费领取会员
使用MVVMlight创建一个项目以后,MainViewModel的构造函数是这样的:
public MainViewModel(IDataService dataService)
{
_dataService = dataService;
_dataService.GetData(
(item, error) =>
{
if (error != null)
{
// Report error here
return;
}
WelcomeTitle = item.Title;
});
}
它依赖于一个实现了IDataService 的类,但是在使用的时候,代码确实这样的:
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
如果我们按照一般逻辑来写,应该是写成这样:
public MainViewModel Main
{
get
{
IDataService service = new DataService();//这是一个实现了IDataService 的类
return new MainViewModel(service);
//return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
那这是怎么回事呢?
在使用这个ViewModel之前SimpleIoc.Default还做了两件事:
SimpleIoc.Default.Register<IDataService, DataService>();//这个就应该是所谓的依赖注入,DataService是要创建MainViewModel需要的一个参数,一个依赖项
SimpleIoc.Default.Register<MainViewModel>();
而ServiceLocator.Current.GetInstance<MainViewModel>();
所做的是使用MainViewModel的 ConstructorInfo来创建(第一次Get的时候创建),而调用 ConstructorInfo的时候,我们会发现它需要一个参数,而这个参数的class
的构造函数是没有参数的,应为我们之前做过Register操作,所以可以通过Register时候传的接口和类,来找到这个类,并使用反射来创建一个对象供MainViewModel的
ConstructorInfo来使用,而创建好的MainViewModel会保存在SimpleIoc.Default里,下次使用就不必重新创建(这个应该是服务定位器模式)
本文版权归腿腿教学网及原创作者所有,未经授权,谢绝转载。
上一篇:二次开发教程:MVVMLight的Messenger
下一篇:二次开发教程:C# udp小程序
推荐专题