EventAggregator vs CompositeCommand

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

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

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

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

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

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

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

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

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

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

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

Ответы

Ответ 1

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

  • CanExecute for Commands. Команда может сказать, действительно ли это для исполнения путем вызова Command.RaiseCanExecuteChanged() и имеющий делегат CanExecute return false. Если вы считаете случай "Сохранить все" CompositeCommand, объединяющий несколько Команды "Сохранить", но один из команды говорят, что он не может выполнить, кнопка "Сохранить все" автоматически отключить (приятно!).
  • EventAggregator - это сообщение шаблон и Команды являются Командный шаблон. Несмотря на то что CompositeCommands не указаны явно шаблон пользовательского интерфейса, это неявно (обычно они подключаются к входное действие, например, нажатие кнопки). EventAggregator не так - любая часть приложения эффективно поднять EventAggregator событие: фоновые процессы, ViewModels и т.д. Это посредническая прописка для обмена сообщениями через ваше приложение с поддержкой для таких вещей, как фильтрация, выполнение фонового потока и т.д.

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

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

Ответ 2

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

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