Я использовал ServiceLocator в сочетании с MVVM, чтобы разрешить декларативное связывание из View в ViewModel.
ServiceLocator основан на извлечении, а контейнеры IoC - на принудительной отправке. Например:
Если вы используете контейнер IoC, вы, вероятно, создадите что-то вроде этого:
public MyViewModel(IDataRepository repository)
{
}
Контейнер IoC будет помещать экземпляр IDataRepository в объект при его создании.
Если вы используете ServiceLocator, вы обычно пишете такой код:
public MyViewModel()
{
_repository = ServiceLocator.Instance.DataRepository;
}
Таким образом, в этом случае ViewModel извлекает экземпляр интерфейса IDataRepository из ServiceLocator.
ServiceLocator может поддерживаться контейнером IoC (но не обязательно).
Преимущество этого состоит в том, что вы можете добавить ServiceLocator в качестве ресурса в файл App.xaml, а затем декларативно получить к нему доступ из представлений.
<UserControl
DataContext="{Binding Path=MyViewModel,
Source={StaticResource serviceLocator}}">...</UserControl>
MyViewModel может быть создан контейнером IoC, но он загружается в представление с использованием привязки данных и ServiceLocator.
В моем блоге опубликовано сообщение о внедрении зависимостей, IoC и ServiceLocators в контексте Silverlihgt / MVVM .