2009-12-14 2 views
3

Я создаю демо-версию 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() отображается с сильной ссылкой.

Еще раз спасибо за помощь.

+0

В методе Subscribe() имеется документированная ошибка: http://compositewpf.codeplex.com/WorkItem/View.aspx?WorkItemId=4925&ProjectName=CompositeWPF&PendingVoteId=4925. Однако я не думаю, что это причина того, что я испытываю. Я думаю, что создается слабая ссылка, но она собирает мусор. –

+0

Так в чем была проблема? – GraemeF

ответ

1

Несколько вещей, чтобы проверить:

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

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

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

+0

Спасибо, Грэм. Я не уверен, что я следую ссылке на ссылку на подписанный объект. Не могли бы вы немного расширить и, возможно, предоставить примерную строку кода? Еще раз спасибо. –

+0

Сделайте это «крепкой ссылкой» - извините! – GraemeF

+0

Я просто хочу убедиться, что объект-подписчик сам не собирается (я уверен, что у вас уже есть :) – GraemeF

Смежные вопросы