Ответ 1
Сначала давайте посмотрим, что делает ViewModelLocator и почему мы его используем:
ViewModelLocator объявлен как объект на нашей странице App.xaml и является одноименным приложением. У нас будет один, и только один из них будет доступен для приложения, когда он будет работать.
ViewModelLocator является источником всех наших ViewModels в MVVM Light. Для каждого ViewModel у нас будет свойство в ViewModelLocator, которое позволяет нам получить ViewModel для представления. Этот код выглядит следующим образом:
public class ViewModelLocator
{
public MainPageViewModel MainPage
{
get { return new MainPageViewModel(); }
}
}
Это часть моего App.xaml:
<Application.Resources>
<vm:ViewModelLocator
x:Key="ViewModelLocator" />
</Application.Resources>
Это часть из View.xaml
DataContext="{Binding MainPage, Source={StaticResource ViewModelLocator}}"
Пока все хорошо. Чтобы ответить на ваш первый вопрос, вам нужно использовать Ioc в MVVM Light? Нет. Нет необходимости в том, чтобы ваша viewmodel была предоставлена вашему представлению, полностью созданному и создаваемому ViewModelLocator.
Теперь, на ваш второй вопрос: Какова цель IoC?
IoC предназначен для того, чтобы вы могли сделать следующее:
С Mvvm Light вы делаете следующее:
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<IDataService, Design.DesignDataService>();
}
else
{
SimpleIoc.Default.Register<IDataService, DataService>();
}
SimpleIoc.Default.Register<MainViewModel>();
}
public MainViewModel Main
{
get { return SimpleIoc.Default.GetInstance<MainViewModel>(); }
}
}
public class MainViewModel
{
public ObservableCollection<Foo> Foos { get; set; }
public MainViewModel(IDataService dataService)
{
_dataService=dataService;
Foos=_dataService.GetFoos();
}
}
Когда я разрешаю свой MainViewModel при вызове
SimpleIoc.Default.GetInstance<MainViewModel>()
что происходит внутри, так это то, что SimpleIoc проверяет, имеет ли MainViewModel какие-либо зависимости (параметры в его конструкторе). Затем он пытается решить эти параметры, посмотрев на интерфейсы, которые были зарегистрированы с ним. Он делает это рекурсивно, поэтому, если у DataService была зависимость, он будет создан и передан конструктору DataService при его создании.
Зачем мне все это делать?
- Сделайте ваши классы легко проверяемыми единицами.
- Сделайте свой код управляемым интерфейсом. Это означает, что вы ссылаетесь на интерфейсы, а не на конкретные классы
- Сделайте ваш код свободно связанным. Это означает, что кто-то может изменить реализацию интерфейса и классов, которые потребляют этот интерфейс, не заботятся и не нуждаются в повторной кодировке.
- Автоматически разрешать зависимости классов.
- В MVVM Light вы увидите, что он может определить, когда он работает в режиме разработки (
ViewModelBase.IsInDesignModeStatic
), это означает, что вы можете создавать службы времени разработки для предоставления данных в виде viewmodels, чтобы ваш View в Visual Studio содержал фактические данные.