2016-07-22 106 views
0

这是MVVMLight默认模板(ViewModelLocator.cs)的代码段。为了简单起见,我删除了一些部分。在MVVMLight中使用SimpleIoC有什么好处?

public class ViewModelLocator 
{ 
    static ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

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

     SimpleIoc.Default.Register<MainViewModel>(); 
    } 

    public MainViewModel Main 
    { 
     get 
     { 
      return ServiceLocator.Current.GetInstance<MainViewModel>(); 
     } 
    } 
} 

现在,这是我自己的版本,而不使用SimpleIoC,它是工作相同作为第一个版本(至少在我自己的观察)。

public class ViewModelLocator 
{ 
    static ViewModelLocator() { } 

    public MainViewModel Main 
    { 
     get 
     { 
      if(ViewModelBase.IsInDesignModeStatic) 
       return new MainViewModel(new DesignDataService()); 
      else 
       return new MainViewModel(new DataService()); 
     } 
    } 
} 

在我看来,第二个版本是更容易理解,显然更短。当然,在第一个例子中,只创建了MainViewModel的一个实例(它被称为单例模式吧?),但我认为我们仍然可以在不使用SimpleIoC类的情况下实现它。我的问题是使用SimpleIoc类“注册”类/对象的好处是什么?请给我解释一下。

+0

5th SOLID priciple。 – Karolis

+0

@KarolisKajėnas不确定你的观点。这两个例子都显示了依赖注入,并且问题被标记为这样。 –

+0

@KarolisKajėnas:我会读一读。这是我第一次听到这个原则。 – someone

回答

1

这两个都是依赖注入的例子,但一个使用容器,一个是显式的;有时被称为“穷人的DI”或“纯粹的DI”。

我可能会同意,在这个微不足道的例子中,显式方式并不复杂,可能是我选择的方式。

你可能会发现Mark Seeman's blog post关于何时使用DI容器有用。