ServiceLocator - это анти-шаблон, вы не должны его использовать. Причина, по которой это анти-шаблон, заключается в том, что он позволяет в любое время разрешать объекты внутри класса, снижая полезность вашего DI и делая ваш код более сложным для модульного тестирования.
Я предлагаю сделать одно из следующего:
a) Внедрить модель представления в представление через его конструктор. Разрешите представление, используя Unity, чтобы оно разрешало все зависимости представлений (модель представления) для вас.
Итак:
публичный частичный класс View: UserControl, IViewFoo
{
публичный вид (IViewModel viewModel)
{
DataContext = ViewModel;
}
var view = _container.Resolve ();
}
б)
Используйте вложенное свойство, чтобы внедрить модель представления в DataContext для вас. MEFEDMVVM и MVVMLite оба делают это (ищите их в Codeplex)
с)
Следуйте подходу, основанному на соглашениях, где viewmodel присваивается представлению на основе того, что у него есть совместимые имена (MainView.cs и MainViewModel.cs). Caliburn Micro делает это и очень приятен в использовании. Это также можно найти в CodePlex.