我正在尝试为我的 MVVM Silverlight 应用程序整合所有部分,并且我看到一些博客涉及服务定位器。
什么是服务定位器,什么时候应该使用它?
我将 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 的博文。