完善主体资料,免费赠送VIP会员!
* 主体类型
* 企业名称
* 信用代码
* 所在行业
* 企业规模
* 所在职位
* 姓名
* 所在行业
* 学历
* 工作性质
请先选择行业
您还可以选择以下福利:
行业福利,领完即止!

下载app免费领取会员

NULL

5cdd2dc095060.jpg

二次开发教程:C# 通过MVVMLight探索IOC

发布于:2019-07-25 15:19:58

网友投稿

更多

使用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里,下次使用就不必重新创建(这个应该是服务定位器模式)

本文版权归腿腿教学网及原创作者所有,未经授权,谢绝转载。

未标题-1.jpg

上一篇:二次开发教程:MVVMLight的Messenger

下一篇:二次开发教程:C# udp小程序

60acb4e0ef112.png