在您的 ViewModelLocator 类中,您可能有以下代码行:
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc
实现IServiceLocator
接口,这意味着ServiceLocator
调用时将使用它作为 DI 源。
编辑:
好的,人们想要“全脂且不放过奶油”的答案。开始了!
ServiceLocator
基本上是一个外壳。服务定位器的代码是:
public static class ServiceLocator
{
private static ServiceLocatorProvider currentProvider;
public static IServiceLocator Current
{
get
{
return ServiceLocator.currentProvider();
}
}
public static void SetLocatorProvider(ServiceLocatorProvider newProvider)
{
ServiceLocator.currentProvider = newProvider;
}
}
是的,就是这样。
是什么ServiceLocatorProvider
?它是一个委托,它返回一个实现IServiceLocator
.
SimpleIoc
实现IServiceLocator
。所以当我们这样做时:
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
我们将SimpleIoc
对象放入ServiceLocator
. 您现在可以使用其中任何一个,因为无论您调用ServiceLocator.Current
还是SimpleIoc.Default
返回相同的对象实例。
那么,两者之间有什么区别吗?
userToken = SimpleIoc.Default.GetInstance();
mainVM = ServiceLocator.Current.GetInstance();
?
没有。没有任何。两者都是暴露静态属性的单例,该属性是IServiceLocator
. 如上所述,IServiceLocator
无论您调用哪个,您都将返回相同的对象实例。
ServiceLocator.Current.GetInstance()
您可能想要使用而不是使用的唯一原因SimpleIoc.Default.GetInstance()
是,在将来的某个时候您可能会更改 DI 容器,如果您使用ServiceLocator
,则不必更改代码。