Prism 2.1 Опубликовать / Подписаться со слабой ссылкой?

Я создаю демонстрацию Prism 2.1, чтобы освоить технологию. У меня проблема с CompositePresentationEvents, опубликованными и подписанными через службу агрегации событий. Подписка на события работает нормально, если я установил строгую ссылку (KeepSubscriberReferenceAlive = true), но не удалось, если я установил слабую ссылку (KeepSubscriberReferenceAlive опущен).

Я хотел бы подписаться со слабой ссылкой, чтобы мне не пришлось управлять отменой подписки на событие. Есть ли способ сделать это? Почему здесь нужна сильная ссылка? Спасибо за вашу помощь!

Вот подробности: Моё демонстрационное приложение является однопоточным и имеет два региона, Navigator и Workspace, и три модуля, NavigatorModule, WorkspaceAModule и WorkspaceBModule. Модуль NavigatorModule имеет две кнопки: "Показать рабочее пространство A" и "Показать рабочее пространство B". Когда нажата одна из этих кнопок, вызывается ICommand, которая публикует CompositePresentationEvent с именем ViewRequested. Событие несет строку полезной нагрузки, которая указывает, какой модуль рабочей области должен быть показан.

Вот объявление события из проекта инфраструктуры приложения:

using Microsoft.Practices.Composite.Presentation.Events;

namespace Prism2Demo.Common.Events
{
    public class ViewRequestedEvent : CompositePresentationEvent<string>
    {
    }
}

Вот код публикации события из модуля Navigator:

// Publish ViewRequestedEvent
var eventAggregator = viewModel.Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Publish(workspaceName);

Вот код подписки на событие, который каждый модуль Workspace включает в свой метод Initialize():

// Subscribe to ViewRequestedEvent
var eventAggregator = m_Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Subscribe(this.ViewRequestedEventHandler, ThreadOption.PublisherThread, true);

Оператор Subscribe() показан с сильной ссылкой.

В очередной раз благодарим за помощь.

1 ответ

Решение

Несколько вещей для проверки:

Убедитесь, что ваш EventAggregator Экземпляр корректно регистрируется в контейнере или сам может быть сборщиком мусора:

container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager());

Также убедитесь, что у вас есть сильная ссылка на подписанный объект, хранящийся где-то (this в вашем коде подписки).

Другие вопросы по тегам