Агрегация событий Prism - абонент не сработал

Я работаю над реализацией агрегации событий с помощью Prism. У меня есть несколько модулей, и я хочу, чтобы каждый из них подписывался на события, которые сообщают им, когда они запрашиваются. Я начал делать простой пример с подпиской и издателем в оболочке. Там нет проблем. В настоящее время; когда я перемещаю подписчиков на свои модули, они не срабатывают. Что еще более странно, это то, что на самом деле это сработало несколько раз - и все это я ожидал в точке останова. Так что мне кажется, что это какое-то состояние гонки, но я не понимаю почему.

Предположение сделано: Мне не нужно нигде настраивать IEventAggregator - например, регистрация в контейнере IoC? Это встроено в Prism, так что у меня есть только один экземпляр агрегатора событий, верно?

Итак, вопрос заключается в том, как / где / когда я должен настроить своих подписчиков. Есть ли конкретный порядок на вещи и т. Д.? В моем упрощенном примере у меня есть один модуль MyModule. Bootstrapper добавит MyModule в каталог, сделав его инициализированным:

catalog.AddModule(typeof(MyModule));

MyModule будет хранить агрегатор и использовать его для подписки на MyModuleRequestedEvent. Он также использует реестр меню для регистрации в меню приложения. Идея состоит в том, что в конечном итоге нажатие в меню должно вызвать событие - уведомление MyModule о том, что оно было запрошено. Тогда я хочу, чтобы на MyModule была ответственность, чтобы выяснить, что делать дальше.

public MyModule(IEventAggregator aggregator, IApplicationMenuRegistry menu)
{
    _applicationMenu = menu;
    _aggregator = aggregator;
}

public void Initialize()
{
    var evnt = _aggregator.GetEvent<MyModuleRequestedEvent>();
    evnt.Subscribe(MyModuleRequested);
    _applicationMenu.RegisterMenuItem("MyModule", evnt);
}

public void MyModuleRequested(bool b)
{
    MessageBox.Show("MyModule requested");
}

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

public Shell(IEventAggregator aggregator)
{
    InitializeComponent();
    var evnt = aggregator.GetEvent<MyModuleRequestedEvent>();
    EventTriggerButton.Click += (s, e) => evnt.Publish(true);
}

Примечания:

Убедитесь, что событие опубликовано. Добавление подписчика в оболочку также заставит этого подписчика получить событие.Очередной раз; подписчик в MyModule не запущен. Однако, как ни странно, это было несколько раз.Я не использую вход для события. Казалось, что вам нужно иметь какой-то тип ввода, поэтому я просто пошел с фиктивным булом. Могу ли я избавиться от этого ..?

Ответы на вопрос(2)

Ваш ответ на вопрос