Вопрос

Я ознакомился с руководством Prism и думаю, что понял большинство их средств связи.

Командование очень простое, поэтому ясно, что DelegateCommand будет использоваться только для соединения представления с его моделью.

Несколько менее ясно, когда дело доходит до межмодульной связи, особенно когда использовать EventAggregation вместо составных команд.

Практический эффект тот же, например.

  • Вы публикуете событие -> все подписчики получают уведомление и выполняют код в ответ.
  • Вы выполняете составную команду -> все зарегистрированные команды выполняются, а вместе с ними и прикрепленный к ним код.

Оба работают по принципу «выстрелил и забыл», то есть их не волнуют какие-либо ответы от своих подписчиков после запуска события/выполнения команд.

Мне трудно увидеть практическую разницу в использовании, хотя я понимаю, что реализация обоих (под капотом) сильно отличается.

Так стоит ли нам задуматься о том, что на самом деле означает — Событие?Это когда что-то происходит (происходит событие)?Что-то, что пользователь не запрашивал напрямую, например «веб-запрос завершен»?

А командование?Означает ли это, что пользователь щелкнул что-то и, таким образом, отправил команду нашему приложению, напрямую запросив услугу?

Это оно?Или есть другие способы определить, когда использовать одно из этих средств связи вместо другого.Руководство, хотя и является одним из лучших документов, которые я читал, не дает никаких конкретных объяснений.

Поэтому я надеюсь, что люди, участвующие в использовании Prism, смогут помочь пролить свет на этот вопрос.

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

Решение

Между этими двумя есть два основных различия.

  1. CanExecute для команд.Команда может сказать, является ли он действительным для выполнения, позвонив по команде.Если вы рассмотрите случай «Сохранить все» CompositeCommand Compositing несколько команд «Сохранить», но один Из команд, говорящих, что он не может выполнить, кнопка «Сохранить все» автоматически отключится (приятно!).
  2. EventAggregator - это шаблон обмена сообщениями, а команды - это командный шаблон.Хотя CompositeCommands явно не являются шаблоном пользовательского интерфейса, это неявно (как правило, они подключены к входному действию, например, нажатие кнопки).Eventaggreator не так - любая часть приложения эффективно повышает событие Eventaggreator:Фоновые процессы, видоидры и т. Д.Это предварительный проспект для обмена сообщениями по всему приложению при поддержке таких вещей, как фильтрация, выполнение фонового потока и т. Д.

Надеюсь, это поможет объяснить различия.Труднее сказать, когда использовать каждый из них, но обычно я использую эмпирическое правило, согласно которому если событие вызывает взаимодействие с пользователем, используйте команду для чего-либо еще, используйте EventAggregator.

Надеюсь это поможет.

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

Кроме того, есть еще одно важное отличие:В текущей реализации событие из EventAggregator асинхронный, а CompositeCommand синхронный.

Если вы хотите реализовать что-то вроде «сообщить о том, что произошло событие X;сделать что-то, что зависит от обработчиков событий для выполнения события X", вам нужно либо сделать что-то вроде Application.DoEvents(), либо использовать CompositeCommands.

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