Как реализовать шаблон ViewModelLocator при использовании дочерних контейнеров IOC?Типичная реализация локатора выглядит примерно так:
public IViewModel ViewModel
{
get { return Services.ServiceLocator.GetInstance<IViewModel>(); }
}
, где Services.ServiceLocator является статическим свойством только для чтения.Но это ломается, если вы используете дочерние контейнеры.Вот мое определение для Services.ServiceLocator с использованием дочерних контейнеров:
public static IServiceLocator ServiceLocator
{
get { return RootContext.ServiceLocator; }
}
Очевидно, что это не правильно: мои внедренные зависимости будут исходить из корневого контейнера, а не из дочернего контейнера.(Дочерний контейнер создается и загрузка связывается с чем-то, отличным от моего текущего представления. Таким образом, мое текущее представление может автоматически связываться с дочерним контейнером.)
Итак, как вы получаете правильный контейнер в сценарии с несколькими контейнерами?Стандартный ответ заключается в том, чтобы конструктор внедрил его, но это не представляется возможным с ViewModelLocator: для него требуется конструктор по умолчанию, поэтому он может быть построен из XAML.
Я также ищу решение, которое работает как в Silverlight 4, так и в WPF 4.0, так как я работаю над составным приложением PRISM (таким образом, без расширений разметки).Я использую Unity в качестве контейнера IOC.Да, и решение должно работать в Blend (то есть оно не должно препятствовать созданию новой модели представления времени разработки, которая обходит контейнер IoC).