2009-02-05 67 views

回答

13

我已经使用ServiceLocator和MVVM结合,从视图到ViewModel启用声明式绑定。

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

如果使用IoC容器,你可能会创建这样的事:

public MyViewModel(IDataRepository repository) 
{ 
} 

的IoC容器将推动IDataRepository实例到对象而构建的。

如果你使用一个服务定位器,你通常会这样写代码:

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

因此,在这种情况下,视图模型是拉动从服务定位的IDataRepository接口的实例。

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

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

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

的MyViewModel可能被IoC容器被创建,但它的使用数据绑定和服务定位拉入视图。

我有一个blog post about Dependency Injection, IoC and ServiceLocators in a Silverlihgt/MVVM context在我的博客。

+1

>博客链接不起作用;可能想检查链接。 – atconway 2010-11-02 14:57:31

1

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

它允许消费者根据接口而不是具体的类进行编程。

查看在CodePlex上托管的Common Service Locator

相关问题