【发布时间】:2009-02-05 00:13:47
【问题描述】:
我正在尝试为我的 MVVM Silverlight 应用程序整合所有部分,并且我看到一些博客涉及服务定位器。
什么是服务定位器,什么时候应该使用它?
【问题讨论】:
标签: silverlight mvvm
我正在尝试为我的 MVVM Silverlight 应用程序整合所有部分,并且我看到一些博客涉及服务定位器。
什么是服务定位器,什么时候应该使用它?
【问题讨论】:
标签: silverlight mvvm
我已将 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 拉入视图的。
我的博客上有一个blog post about Dependency Injection, IoC and ServiceLocators in a Silverlihgt/MVVM context。
【讨论】:
【讨论】: