如何使用MVVMLight SimpleIoc?

60

我正在改进我的软件,其中有混乱的 Messenger.Default(...) 代码块。

是否有简明易懂的MVVMLight SimpleIoc使用指南(不是通用IoC介绍)?


你现在具体遇到什么问题?在 SimpleIOC 中,你无法做什么? - Haris Hasan
1
@HarisHasan // 在MVVMLight中,Messenger有很多教程,我也用过它,但我很少找到如何适应和使用MVVMLight SimpleIoC的方法。我已经知道什么是IoC,但只需要了解MVVMLight SimpleIoC的语法和代码示例。 - Youngjae
@ShafikYaghmour // 同意。我的问题不是关于编程书籍或库的推荐。我在询问MVVM-Light项目的类使用,这方面文档很少。 - Youngjae
我建议重新措辞,避免提到教程。 - Shafik Yaghmour
@ShafikYaghmour // 按照您的建议重新措辞了。谢谢。 - Youngjae
显示剩余2条评论
1个回答

145

SimpleIoc备忘单:

  1. 您需要在ViewModelLocator中注册所有接口和对象

    class ViewModelLocator 
    { 
        static ViewModelLocator() 
        {         
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);          
            if (ViewModelBase.IsInDesignModeStatic) 
            {              
                SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();          
            }          
            else         
            {              
                SimpleIoc.Default.Register<IDataService, DataService>();          
            }          
            SimpleIoc.Default.Register<MainViewModel>();                  
            SimpleIoc.Default.Register<SecondViewModel>(); 
        }      
    
    
        public MainViewModel Main 
        {  
            get  
            {      
                return ServiceLocator.Current.GetInstance<MainViewModel>();  
            } 
        }
    }
    
  2. 默认情况下,每个对象都是单例的。如果要解决一个对象不是单例的问题,您需要向GetInstance调用传递一个唯一的值:

  3. SimpleIoc.Default.GetInstance<MainViewModel>(Guid.NewGuid().ToString());
    
  4. 注册一个类到一个接口:

  5. SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
    
  6. 注册一个具体对象到接口:

  7. SimpleIoc.Default.Register<IDataService>(myObject);
    
    注册具体类型的方法如下:
    SimpleIoc.Default.Register<MainViewModel>();
    
  8. 从接口中解析一个对象:

    SimpleIoc.Default.GetInstance<IDataService>();
    
  9. 直接解析一个对象(包括构建和依赖关系解析):

  10. SimpleIoc.Default.GetInstance<MainViewModel>();
    
  11. MVVM 让设计时间数据变得非常容易:

  12. if (ViewModelBase.IsInDesignModeStatic) 
    {              
        SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();          
    }          
    else         
    {              
        SimpleIoc.Default.Register<IDataService, DataService>();          
    }
    

如果您处于设计时模式,它将自动注册您的设计时服务,这样在使用VS设计器时,在视图模型和视图中拥有数据就变得非常容易。


回复:1)我发现SimpleIoc会抛出设计时异常,因为服务已经注册了。如果我放置IsRegistered的检查,然后在我的视图模型中引用SimpleIoc,那么设计时数据就不会显示(没有异常抛出,只是不显示)。如果我删除SimpleIoc并手动创建数据,则可以在设计时显示。所以,我不认为这很“容易” :) 请注意,数据服务在设计时之外运行正常。 - si618
2
啊...在ViewModelLocator中改为静态构造函数可以解决“服务已经注册”的异常。 - si618
我想知道注册服务和视图模型的顺序是否重要? - komizo
不会。SimpleIoc 会在您从中请求对象时尝试解析对象图。只要所有该对象的依赖项都就位,它们被添加到 SimpleIoc 的顺序并不重要,它们将被正确解析。 - Faster Solutions
2
第四种方法似乎不再受支持了...有什么其他的选择吗?目前我正在将单例实例封装在lambda函数中,并将其传递给SimpleIoc工厂注册函数。 - Arthur Nunes
1
@ArthurNunes 看看这个。http://stackoverflow.com/questions/35586715/how-to-register-a-class-instance-including-a-parameter-in-simpleioc - Terrance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接