Prism 2.1 Публикация / подписка со слабой ссылкой? - PullRequest
3 голосов
/ 14 декабря 2009

Я создаю демонстрацию 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 Ответ

1 голос
/ 14 декабря 2009

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

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

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

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

...