2014-10-18 1 views
0

Предположим, что есть приложение WPF, которое использует набор инструментов MVVM light.Должен ли MVVM Locator вызывать любые зарегистрированные ViewModel Funcitons?

Хорошим примером этого инструментария является локатор. Замечательно, что он содержит SimpleIoC, который позволяет нам регистрировать службы и управлять интерфейсом.

Иногда конструктор Locator может действительно расти. Unfortunatelly, кроме регистрации интерфейсов содержат некоторую логику .:

if(SimpleIoc.Default.GetInstance<MainViewModel>().LoadProject()) 
{ 
var project = SimpleIoc.Default.GetInstance<MainViewModel>().LoadedProject 
SimpleIoc.Default.Register<ConfigService>(new Service(project)) 
} 

Это только пример - то, что если мне нужно больше логики при локаторе Конструктора. Возможно, моя архитектура служб ошибочно создана, поскольку они не являются независимыми или, возможно, в таких случаях я должен отказаться от использования Локатора, но тогда я потеряю DI.

Другое дело в том, что в немногих ViewModels есть ссылка на Locator.GetInstance, который я нашел другим не очень хорошей практикой, так как он должен быть введен через contructor для обеспечения возможности тестирования.

Еще один аспект - правильно его использовать с AvalonDock.

AvalonDock - отличный механизм крепления, который позволяет создавать приложения, которые могут быть похожими на такие приложения, как Visual Studio с прикрепляемыми, закрепляемыми панелями.

Это панели являются актуальными еще одним ViewModels, которые привязаны к AvalonDock через свойство.

MainViewModel имеет свойство Tools = новые инструменты [] {ViewModel1, ViewModel2}

Но каждый ViewModel был зарегистрирован в Locator.

поэтому я использую (нарушают DRY) их в MainViewModel, как

добытчика недвижимости: Locator.GetInstance()

, которая, на мой взгляд еще один плохой пример - даже не безопасно. Что делать, если какая-либо услуга, требуемая Avalon Tool ViewModel1, еще не зарегистрирована, но вызывается через getter во время создания экземпляра MainViewModel.

Это стало несоответствием. У вас есть хорошая практика?

Я нашел много примеров, таких как Workspaces (MainViewModel), но никто не использовал в то же время Locator, который я нашел очень полезным.

Я хотел бы сохранить Locator, потому что считаю, что это хорошая вещь, которая позволяет mme проверять мой проект благодаря зависимости Injection и Interface Driven.

Любые идеи предложения? Я был бы благодарен.

ответ

0

Я бы избегал этого. Как вы справедливо отметили, здесь происходит гораздо больше, чем просто регистрация типов.

Вместо этого я передал экземпляр ConfigService в Viewmodel в его конструкторе. Пока он регистрируется первым, вы можете IOC использовать конфигурационную службу и модель просмотра.

SimpleIOC.Register<IViewModel>(()=>{return new ViewModel(SimpleIOC.GetInstance<IConfigService>())}); 

...Это все из памяти, поэтому может быть неточно, но показывает идею конструктора из SimpleIOC.

В вашем представлении конструктор модели вы можете вызвать службу. МетодRegister, передающий себя как параметр.

Это сохраняет «знание» в вашей модели взгляда, и ваш локатор остается сосредоточенным на том, что он должен делать.

 Смежные вопросы

  • Нет связанных вопросов^_^