如何使用MVVMLight SimpleIoc?

You*_*jae 55 c# wpf inversion-of-control mvvm-light windows-store-apps

我正在修改我的软件,它有杂乱的Messenger.Default(...)位.

有没有任何备忘单知道MVVMLight SimpleIoc用法(不是一般的IoC描述)?

Fas*_*ons 136

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>();  
        } 
    }
} 
Run Code Online (Sandbox Code Playgroud)

2)默认情况下,每个对象都是一个单例.要解析对象以使其不是单例,您需要将唯一值传递给GetInstance调用:

SimpleIoc.Default.GetInstance<MainViewModel>(Guid.NewGuid().ToString());
Run Code Online (Sandbox Code Playgroud)

3)针对接口注册类:

SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();  
Run Code Online (Sandbox Code Playgroud)

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

SimpleIoc.Default.Register<IDataService>(myObject);     
Run Code Online (Sandbox Code Playgroud)

5)注册具体类型:

SimpleIoc.Default.Register<MainViewModel>();   
Run Code Online (Sandbox Code Playgroud)

6)从接口解析对象:

SimpleIoc.Default.GetInstance<IDataService>();
Run Code Online (Sandbox Code Playgroud)

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

SimpleIoc.Default.GetInstance<MainViewModel>();
Run Code Online (Sandbox Code Playgroud)

8)MVVM使设计时数据变得非常简单:

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

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

希望这可以帮助.

  • 啊...在 ViewModelLocator 中更改为静态 ctor 修复了“服务已注册”异常。 (2认同)
  • 方法 4) 似乎不再受支持......有没有办法做到这一点?目前,我将单例实例封装在 lambda 函数中,并将其传递给 SimpleIoc 工厂注册函数。 (2认同)