Вопрос

Я разрабатываю приложение WPF, используя шаблон MVVM. Я использую MVVM Light Lilection, и я также пытаюсь использовать инъекцию зависимости (я рассматриваю, что Ninject и Unity).

Я прочитал много статей в блоге, и я вполне путающуюся о «правильном» способе заставить мои занятия общаться друг с другом. В частности, я не знаю, когда использовать инъекцию зависимости и когда полагаться на образец посредника.

Давайте рассмотрим пример. У меня есть ViewModel, давайте назовем его dataviewmodel, а класс данных, который предоставляет некоторые данные. Как лучше общаться между ними:

A. Введите зависимость от DataViewModel с интерфейсом IDATA? Таким образом, данные не придется полагаться на Messenger, но ему придется предоставить событие, если данные изменяются, а ViewModel придется подписаться на него.

B. Положите на узор посредника (реализован в MVVM Light As Messenger) и отправлять сообщения между моделью и ViewModel? Таким образом, вообще не нужно будет использовать инъекцию зависимости, потому что целое сообщение будет основано на сообщениях.

Более того, должны ли мои просмотра модерты вводили зависимости на других просмотрах, или было бы лучше просто полагаться на посланника? Если первое, было бы необходимо определить отдельный интерфейс для каждого просмотраModel? Я думаю, что определение интерфейса для каждого VM будет дополнительной работой, но, возможно, стоит.

Это было полезно?

Решение

Как правило, ViewModel идет на сервис (как призма вызывает ее), чтобы получить потребности в нужных данных. Этот сервис нажата на ViewModel через DI (инъекция конструктора), хотя вы можете выполнить это другим способом через сервопривод.

Поэтому ваш ViewModel удержит ссылку на сервис, которая будет абстрактным повторным извлечению ваших данных. Данные могут исходить из БД, XML-файла, который знает ... абстракция там. Таким образом, для вашего случая IDATA ссылка на тот тип произойдет в какой-то момент в просмотру, но не посредством любого из ди. Если ваш IOC Framework позволяет ей (призму) вы создаете отображения типов интерфейсов к бетонным типам, а затем извлеките эти типы через контейнер; Таков имеет дело с единством.

Вот краткий пример ... Сценарии связаны с просмотром, а ViewModel вводится в представление. Обратите внимание на использование iScriptservice для получения данных. Данные, возвращающиеся к списку - это коллекция типов Iscript, однако мы никогда не вводили, что вводят тип в ViewModel, потому что мы не заботимся о типе как единого объекта, которое мы заботимся о типе на веревке.

        public ScriptRepositoryViewModel(IUnityContainer container, IScriptService scriptService, IEventAggregator eventAggregator)
        {
            _container = container;
            _scriptService = scriptService;
            _eventAggregator = eventAggregator;
        }

        public ICollectionView Scripts
        {
           get 
           {
               if (_view == null)
               {
                   _view = CollectionViewSource.GetDefaultView(_scriptService.Scripts);
                   _view.Filter = Filter;
               }

               return _view;
           }
       }

Когда вы проходите к своему просмотру, тот же случай может быть там, вид впрыскивается через Di (инъекция конструктора) со просмотрамоделью. Я бы не сделал другие просмотра модернов зависит друг от друга, держите их изолированный. Если вы начнете видеть необходимость муфты, взгляните на данные, которые вы пытаетесь поделиться, чаще всего к тому, что данные должны быть отделены дальше, а не сопряжены с любым просмотром Model.

Другие советы

Есть более одного хорошего решения вашей проблемы,

Я предлагаю вам использовать один из одного интерфейса в ваших моделях данных, поместите его в базовый класс, этот интерфейс позволит вам общаться с внешним миром.

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

УДАЛЕНИЕ ДАННЫХ НЕ МОЖЕТ Знать, кто удерживает его, посмотреть модель, знает, какие данные он проводит, но я не рекомендую вводить эти данные из-за проблем с гибкостью.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top