Я впервые использую агрегатор событий, поэтому прошу прощения, если я упускаю из виду или неправильно понимаю что-то совершенно очевидное.
В моем проекте 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>
. - Кроме того, мой корень композиции будет трудно читать, потому что в нем будет отсутствовать информация о фактической иерархии зависимостей (которую можно заменить комментариями, но все же).