在MVVMLight中使用SimpleIoC有什么好处?

时间:2016-07-22 06:31:52

标签: c# wpf dependency-injection inversion-of-control mvvm-light

这是MVVMLight(ViewModelLocator.cs)默认模板的代码段。为简单起见,我删除了一些部分。

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类的情况下实现它。我的问题是&#34;使用SimpleIoc类注册&#34; 类/对象的好处是什么?请解释一下。

1 个答案:

答案 0 :(得分:1)

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

我可能同意在这个简单的例子中,明确的方式不那么复杂,可能就是我选择的。

您可能会发现Mark Seeman's blog post何时使用DI容器。