4

我正在尝试为我的 MVVM Silverlight 应用程序整合所有部分,并且我看到一些博客涉及服务定位器。

什么是服务定位器,什么时候应该使用它?

4

2 回答 2

13

我将 ServiceLocator 与 MVVM 结合使用,以启用从 View 到 ViewModel 的声明性绑定。

ServiceLocator 是基于拉的,而 IoC 容器是基于推的。例如:

如果您使用 IoC 容器,您可能会创建如下内容:

public MyViewModel(IDataRepository repository)
{
}

IoC 容器将在构造对象时将 IDataRepository 实例推送到对象中。

如果您使用 ServiceLocator,您通常会编写如下代码:

public MyViewModel()
{
    _repository = ServiceLocator.Instance.DataRepository;
}

因此,在这种情况下,ViewModel 正在从 ServiceLocator 中提取 IDataRepository 接口的一个实例。

ServiceLocator 可能由 IoC 容器支持(但不是必需的)。

这样做的好处是您可以将 ServiceLocator 作为资源添加到 App.xaml 文件中,然后以声明方式从视图中访问它。

<UserControl 
    DataContext="{Binding Path=MyViewModel, 
                  Source={StaticResource serviceLocator}}">...</UserControl>

MyViewModel 可能由 IoC 容器创建,但它是使用数据绑定和 ServiceLocator 拉入视图的。

我的博客上有一篇关于 Silverlihgt/MVVM 上下文中的依赖注入、IoC 和 ServiceLocators 的博文。

于 2009-02-05T08:38:29.003 回答
1

服务定位器是一种类似于依赖注入的设计模式。

它允许消费者针对接口而不是具体类进行编程。

查看CodePlex 上托管的Common Service Locator 。

于 2009-02-05T03:58:07.197 回答