Я создаю демо-версию Prism 2.1, чтобы получить скорость с помощью технологии. У меня возникла проблема с CompositePresentationEvents, опубликованным и подписанным через службу агрегирования событий. Подписка на подписку отлично работает, если я устанавливаю сильную ссылку (KeepSubscriberReferenceAlive = true), но она терпит неудачу, если я устанавливаю слабую ссылку (KeepSubscriberReferenceAlive опущен).Prism 2.1 Опубликовать/Подписываться со слабым ссылкой?
Я хотел бы подписаться со слабой ссылкой, так что мне не нужно управлять отменой подписки на событие. Есть ли способ сделать это? Почему здесь требуется сильная ссылка? Спасибо за вашу помощь!
Вот данные: Мое демо-приложение однопоточное и имеет два региона: Навигатор и рабочее пространство, а также три модуля NavigatorModule, WorkspaceAModule и WorkspaceBModule. NavigatorModule имеет две кнопки: «Показать рабочее пространство A» и «Показать рабочее пространство B». Когда одна из этих кнопок нажата, вызывается ICommand, которая публикует CompositePresentationEvent с именем ViewRequested. Событие содержит строку полезной нагрузки, которая указывает, какой модуль рабочей области должен отображаться.
Вот объявление события, от проекта Инфраструктура приложения:
using Microsoft.Practices.Composite.Presentation.Events;
namespace Prism2Demo.Common.Events
{
public class ViewRequestedEvent : CompositePresentationEvent<string>
{
}
}
Вот событие публикации кода из модуля Навигатор:
// Publish ViewRequestedEvent
var eventAggregator = viewModel.Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Publish(workspaceName);
Вот код подписки на события, которые каждый модуль рабочей области включает в свой метод Initialize():
// Subscribe to ViewRequestedEvent
var eventAggregator = m_Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Subscribe(this.ViewRequestedEventHandler, ThreadOption.PublisherThread, true);
Оператор Subscribe() отображается с сильной ссылкой.
Еще раз спасибо за помощь.
В методе Subscribe() имеется документированная ошибка: http://compositewpf.codeplex.com/WorkItem/View.aspx?WorkItemId=4925&ProjectName=CompositeWPF&PendingVoteId=4925. Однако я не думаю, что это причина того, что я испытываю. Я думаю, что создается слабая ссылка, но она собирает мусор. –
Так в чем была проблема? – GraemeF