WedX - журнал о программировании и компьютерных науках

Как явно выразить зависимости при использовании агрегатора событий?

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

  • В моем проекте MVVM у меня есть несколько классов моделей, которые зависят от одних и тех же периодически обновляемых данных, и им нужно реагировать на изменения данных. (Некоторые из этих классов создают свои собственные данные на основе этой зависимости, которые также необходимо отправлять другим классам.)

  • Вместо того, чтобы внедрять эту же зависимость в несколько классов моделей и использовать INotifyPropertyChange/PropertyChanged, я хочу использовать EventAggregator от Caliburn Micro для публикации и обработки обновленных данных.

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

Итак, следующее в моем корне композиции (очевидно, просто пример кода):

_dependency = new Dependency();
_dependent1 = Dependent1(_dependency);
_dependent2 = Dependent2(_dependency);
...

Становится следующим, если я прав:

_eventAggregator = new EventAggregator();
_dependency = new Dependency(_eventAggregator); // Publishes
_dependent1 = Dependent1(_eventAggregator); // Handles
_dependent2 = Dependent2(_eventAggregator); // Handles
...

Примечания:

  • Caliburn Micro содержит общий IHandle<T> интерфейс, который можно использовать для выражения обработки определенных типов объектов.
  • Но у него нет соответствующего интерфейса IPublish<T> для явного выражения публикации определенных типов объектов. И даже это не будет являться проверкой времени компиляции для соответствующей пары IPublish<T>IHandle<T>.
  • Кроме того, мой корень композиции будет трудно читать, потому что в нем будет отсутствовать информация о фактической иерархии зависимостей (которую можно заменить комментариями, но все же).

Ответы:


1

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

Ну, это цель использования агрегатора событий. Все классы знают только о самом агрегаторе событий, но ничего не знают и не зависят друг от друга. Это означает, что вы можете изменить один класс, не затрагивая другой.

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

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

05.04.2017
  • Я исключал ваш ответ; Я видел, что вы часто отвечаете на эти теги. :) Как вы думаете, есть ли способ гарантировать (во время компиляции), что если обработчик X существует, то существует и соответствующий издатель X? 05.04.2017
  • Если вам нужны такие гарантии, нет смысла использовать агрегатор событий. Тогда вы могли бы также иметь прямую ссылку на издателя и подключиться к его событию, используя синтаксис +=. Это способ гарантировать, что событие действительно существует во время компиляции. 05.04.2017
  • Спасибо; Я подозревал, что могу запутаться в вариантах использования. Больше всего мне хотелось централизовать обмен сообщениями между классами на основе ответов на этот вопрос - но при этом сохранить эту гарантию, да. 05.04.2017
  • Агрегатор событий устраняет тесную связь между издателями и подписчиками, но это, очевидно, также устраняет гарантию, о которой вы говорите. Пожалуйста, обратитесь к следующему сообщению в блоге для получения дополнительной информации об этом: view-models/" rel="nofollow noreferrer">blog.magnusmontin.net/2014/02/28/ 05.04.2017
  • Извини за это :). Попробуйте еще раз сейчас. 05.04.2017
  • Спасибо, читаю! :) Жаль, что мне удалось опубликовать еще один, не очень полезный вопрос, основанный на путанице; Я подумаю, как переформулировать его, чтобы сделать его более полезным для будущих посетителей. 05.04.2017
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: wedx@cp9.ru