【问题标题】:how to use MVVMLight SimpleIoc? [closed]如何使用 MVVMLight SimpleIoc? [关闭]
【发布时间】:2012-12-10 05:37:59
【问题描述】:

我正在改进我的软件,它有凌乱的Messenger.Default(...) 位。

是否有任何备忘单可以了解 MVVMLight SimpleIoc 的用法(不是一般的 IoC 描述)?

【问题讨论】:

  • 您到底面临什么问题?在 SimpleIOC 中你不能做什么?
  • @HarisHasan // MVVMLight 中的 Messenger 有很多教程,我用得很方便,但我几乎找不到如何适应和使用 MVVMLight SimpleIoC。我已经知道 IoC 是什么,但只需要通过代码示例从语法上了解 MVVMLight SimpleIoC。
  • 虽然 OP 实际上要求提供场外资源,但问题的答案并不需要,如下所示。不知道如何重新措辞,但我相信它可以重新措辞,以免听起来离题。投票重新开放。
  • @ShafikYaghmour // 同意。我的问题与编程书籍或图书馆推荐无关。我问的是一个很少记录的 MVVM-Light 项目的类用法。
  • 我建议重新措辞以避免提及教程。

标签: c# wpf inversion-of-control mvvm-light windows-store-apps


【解决方案1】:

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 调用:

SimpleIoc.Default.GetInstance<MainViewModel>(Guid.NewGuid().ToString());

3) 针对接口注册一个类:

SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();  

4) 针对接口注册一个具体对象:

SimpleIoc.Default.Register<IDataService>(myObject);     

5) 注册一个具体类型:

SimpleIoc.Default.Register<MainViewModel>();   

6) 从接口解析对象:

SimpleIoc.Default.GetInstance<IDataService>();

7) 直接解析对象(构建和依赖解析):

SimpleIoc.Default.GetInstance<MainViewModel>();

8) MVVM 使处理设计时数据变得非常容易:

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

如果您处于设计时模式,它将自动注册您的设计时服务,从而在 VS 设计器中工作时非常容易在您的视图模型和视图中拥有数据。

希望这会有所帮助。

【讨论】:

  • Re: 1) 我发现 SimpleIoc 抛出设计时异常,因为服务已经注册。如果我检查 IsRegistered,然后在我的视图模型中引用 SimpleIoc,则不会显示设计时数据(不抛出异常,只是不显示)。如果我删除 SimpleIoc 并手动创建数据,那么它会在设计时显示。所以,不,我不认为这“真的很容易” :) 请注意,数据服务在设计时间之外也能正常工作。
  • 啊...在 ViewModelLocator 中更改为静态 ctor 可修复“服务已注册”异常。
  • 我想知道注册服务和视图模型的顺序是否重要?
  • 方法 4) 似乎不再受支持...有什么选择吗?目前,我将单例实例包含在 lambda 函数中并将其传递给 SimpleIoc 工厂寄存器函数。
  • @ArthurNunes 看看这个。 stackoverflow.com/questions/35586715/…
猜你喜欢
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 2014-06-22
  • 2016-05-26
  • 2018-08-03
相关资源
最近更新 更多