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

What is the benefit of using SimpleIoC in MVVMLight?

这是来自 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 class 的情况下实现它。我的问题是 "registering" a class/object 使用 SimpleIoc class 有什么好处?请给我解释一下。

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

我可能会同意,在这个简单的示例中,显式方法不那么复杂,并且可能是我选择的方法。

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