Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ViewModelLocator、ServiceLocator和依赖项注入之间的异同_C#_Design Patterns_Mvvm_Dependency Injection_Inversion Of Control - Fatal编程技术网

C# ViewModelLocator、ServiceLocator和依赖项注入之间的异同

C# ViewModelLocator、ServiceLocator和依赖项注入之间的异同,c#,design-patterns,mvvm,dependency-injection,inversion-of-control,C#,Design Patterns,Mvvm,Dependency Injection,Inversion Of Control,我对模式感到困惑:ViewModelLocator,ServiceLocator,依赖项注入 最新结论如下: ViewModelLocator。连接视图和视图模型的位置 public ViewModelLocator() { SimpleIoc.Default.Register<MainViewModel>(); SimpleIoc.Default.Register<SettingViewModel>(); } public MainViewModel

我对模式感到困惑:
ViewModelLocator
ServiceLocator
依赖项注入

最新结论如下:

ViewModelLocator
。连接
视图
视图模型
的位置

public ViewModelLocator()
{
    SimpleIoc.Default.Register<MainViewModel>();
    SimpleIoc.Default.Register<SettingViewModel>();
}

public MainViewModel MainViewModel => SimpleIoc.Default.GetInstance<MainViewModel>();
public SettingViewModel SettingViewModel => SimpleIoc.Default.GetInstance<SettingViewModel>();

// View
private MainViewModel ViewModel => ViewModelLocator.Current.MainViewModel;
ServiceLocator
。这是怎么一回事?与
ViewModelLocator
相同,但被许多人认为是反模式的?事实证明,
ViewModelLocator
也很糟糕。但是如何连接
视图
视图模型
<代码>服务定位器是否只需要存储服务?正如您所理解的,所有的混淆都来自
ServiceLocator

你能解释一下这些元素之间的异同吗?最终唯一地识别并正确使用它们。谢谢您的帮助。

您,从中我推断
ViewModelLocator
等源自您链接到那里的示例代码库。从目前为止我从显示的代码示例中收集到的信息来看,代码库似乎不是使用依赖项注入的最佳示例

因此,任何涉及解释该代码库中的“模式”的问题都应该由响应来解决

这个问题暗示了一个错误的前提。前提是从代码库中可以学到一些东西。情况可能并非如此

服务定位器不是一种模式。(大多数人似乎都同意我的观点,到目前为止还没有人能够提出令人信服的反驳。)

依赖注入不是一种模式;这是一套设计原则和(几个)模式。这就是我们试图在中描述的

然后如何连接
视图
视图模型

我相信,MVVM模式的最佳解释仍然是。如果您想看到一个结合了MVVM和依赖注入的完整代码示例,可以从中获得(新版本还提供了一本免费电子书)

ServiceLocator
是否只需要存储服务

不,应该根本没有服务定位器。这就是我的意思的一个例子。看来,代码库并不是学习依赖注入的好方法。它产生的混乱多于洞察。

您,从中我推断
ViewModelLocator
等源自您链接到那里的示例代码库。从目前为止我从显示的代码示例中收集到的信息来看,代码库似乎不是使用依赖项注入的最佳示例

因此,任何涉及解释该代码库中的“模式”的问题都应该由响应来解决

这个问题暗示了一个错误的前提。前提是从代码库中可以学到一些东西。情况可能并非如此

服务定位器不是一种模式。(大多数人似乎都同意我的观点,到目前为止还没有人能够提出令人信服的反驳。)

依赖注入不是一种模式;这是一套设计原则和(几个)模式。这就是我们试图在中描述的

然后如何连接
视图
视图模型

我相信,MVVM模式的最佳解释仍然是。如果您想看到一个结合了MVVM和依赖注入的完整代码示例,可以从中获得(新版本还提供了一本免费电子书)

ServiceLocator
是否只需要存储服务


不,应该根本没有服务定位器。这就是我的意思的一个例子。看来,代码库并不是学习依赖注入的好方法。它产生的混乱比洞察力更多。

您能读一下吗?您对基于文章的ViewModelLocator有何看法?@从浏览那篇文章来看,它看起来就像是
ViewModelLocator
本身。这本身并没有什么错,但在内部它使用了服务定位器,所以我仍然不认为这样的代码值得仿效。我有一种复杂的感觉。一方面,有无处不在的例子(也来自微软)和流行的MVVM轻型框架。另一方面,您与服务定位器的“战争”以及文章和书籍的链接。在这一点上,我得出结论,ServiceLocator的问题与我的编程经验无关。因为这是我这样的人的工作示例(没有经验,初学者)和抽象之间的一个选择,通过创建“自行车”思考“如果…”(同样是为了我的经验)。顺便说一下,我注意到MVVM Light中的ServiceLocator。也就是说,ViewModelLocator仅使用SimpleIoc构建。据我所知,依赖注入(DI)确实是一个中间话题。如果你没有经验,这可能不是最好的开始。DI解决了中长期的问题。这对你现在的工作毫无帮助。若这是你们的问题,那个么忽略所有DI和服务定位器。然而,一旦你想解决那些更长远的问题,你想实际解决它们,我想?如果是这样的话,你需要学习如何做到这一点。你能读一下吗?您对基于文章的ViewModelLocator有何看法?@从浏览那篇文章来看,它看起来就像是
ViewModelLocator
本身。这本身并没有什么错,但在内部它使用了服务定位器,所以我仍然不认为这样的代码值得仿效。我有一种复杂的感觉。一方面,有无处不在的例子(也来自微软)和流行的MVVM轻型框架。另一方面,您与服务定位器的“战争”以及文章和书籍的链接。在这一点上,我得出结论,ServiceLocator的问题与我的编程经验无关。因为这是在像我这样的人(没有经验的初学者)的工作示例和
private readonly INavigationService _navigation;

public ShellViewModel(INavigationService navigation)
{
    _navigation = navigation;
}