gpt4 book ai didi

inversion-of-control - SimpleIoc.Default.GetInstance 和 ServiceLocator.Current.GetInstance 之间有区别吗

转载 作者:行者123 更新时间:2023-12-04 03:58:58 30 4
gpt4 key购买 nike

我正在使用适用于 Windows 8 的 MVVM Light 第 4 版;它包括 SimpleIOC。在各种示例中,我有时会看到基于 SimpleIoc 请求对象的代码......有时它基于 ServiceLocator......

示例包括:

userToken = SimpleIoc.Default.GetInstance();

mainVM = ServiceLocator.Current.GetInstance();

使用 SimpleIoc.Default.GetInstance 和 ServiceLocator.Current.GetInstance 有什么区别?

如果没有区别,ServiceLocator 是否只是让我可以选择改变我对要使用哪个 IOC 库的想法?如果我对 SimpleIoc 感到满意,ServiceLocator 是否只是提供了一个无关紧要的额外抽象层?或者,ServiceLocator 是否执行了其他一些对我们 IOC 新手来说并不明显的有用魔法?

感谢您的洞察力!

最佳答案

在您的 ViewModelLocator 类中,您可能有以下代码行:

public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
SimpleIoc实现 IServiceLocator接口(interface),这意味着 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 ?它是一个委托(delegate),它返回一个实现 IServiceLocator 的对象.
SimpleIoc实现 IServiceLocator .所以当我们这样做时:
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

我们把我们的 SimpleIoc对象进入 ServiceLocator .您现在可以使用其中任何一个,因为无论您调用 ServiceLocator.CurrentSimpleIoc.Default您正在返回相同的对象实例。

那么,两者之间有什么区别吗?
userToken = SimpleIoc.Default.GetInstance();

mainVM = ServiceLocator.Current.GetInstance();

?

没有。没有任何。两者都是暴露一个静态属性的单例,它是 IServiceLocator 的实现。 .如上所述,您将返回实现 IServiceLocator 的相同对象实例。不管你叫什么。

您可能想要使用 ServiceLocator.Current.GetInstance() 的唯一原因而不是 SimpleIoc.Default.GetInstance()是在将来的某个时候您可能会更改 DI 容器,如果您使用 ServiceLocator ,您不必更改代码。

关于inversion-of-control - SimpleIoc.Default.GetInstance 和 ServiceLocator.Current.GetInstance 之间有区别吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14044551/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com