События не будут проходить через модули (призма, MVVM, silverlight c #) - PullRequest
3 голосов
/ 18 октября 2010

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

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

Теперь в модели представления навигации у меня есть агрегатор событий, которыйпубликует событие (класс, который наследует от EventArgs, если это важно), два других модуля подписались на это событие, но не получили его,

/// <summary>
    /// Carries the out menu item selection methods.
    /// </summary>
    /// <param name="e">The <see cref="TMBL.Web.TMBLCore.Controls.Assets.NavigationViewSelectionEventArgs"/> instance containing the event data.</param>
    public void CarryOutMenuItemSelectionMethods(NavigationViewSelectionEventArgs e)
    {
        _eventAggregator.GetEvent<NavigationMenuItemSelectedEvent>().Publish(e);
    }

в навигационной ViewModel, а затем подписались в модуле новостей

_eventAggregator.GetEvent<NavigationMenuItemSelectedEvent>().Subscribe(NavigationMenuReturnedEvent,
                                                                               ThreadOption.UIThread);

Казалось бы, достаточно просто, я могу подписаться на это событие в моем навигационном модуле, и он его забирает, он просто не выходит за пределы модуля, что нужно сделать, чтобы достичь этого?

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

_displayNewsView = new DisplayNewsView(new DisplayNewsViewModel(_eventAggregator));

Или событие должноагрегатор попадет в viewmodels по-другому?

Спасибо за ваше время

Ответы [ 2 ]

3 голосов
/ 18 октября 2010

Вы правильно вводите агрегатор событий, но есть пара вещей, которые необходимо проверить.

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

2) Определен ли NavigationMenuItemSelectionEvent в общей сборке, которая является общей для всех модулей?Если это так (как я и ожидал), убедитесь, что одна и та же сборка используется в разных модулях.Вы можете проверить это, когда загружаете приложение с помощью отладчика и просматриваете загруженные сборки с помощью окна Модули (Debug> Windows menu).Сборка должна быть указана только один раз.

Если вы видите, что общая сборка загружена несколько раз, возможно, вы загружаете модули из разных каталогов, а общая сборка НЕ ​​подписана..Net будет обрабатывать их как отдельные, и поэтому тип NavigationMenuItemSelectionEvent не будет совпадать.

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

1 голос
/ 19 октября 2010

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

 protected override DependencyObject CreateShell()
    {
        _eventAggregator = new EventAggregator();
        var shell = Container.Resolve<Shell>();
        Application.Current.RootVisual = shell;
        return shell;
    }

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

 protected override IModuleCatalog GetModuleCatalog()
    {
        var catalog = new ModuleCatalog();
        catalog.AddModule(typeof(TMBLCoreModule), InitializationMode.WhenAvailable);
        catalog.AddModule(typeof(NewsModule), InitializationMode.WhenAvailable);
        catalog.AddModule(typeof(UserModule), InitializationMode.WhenAvailable);
        return catalog;
    }

Как мне тогда передать агрегатор событий в каждый модуль.У меня был быстрый Google, но я еще не смог найти эту информацию, извините за мое невежество

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...