Sto lavorando per implementare un'aggregazione di eventi con Prism. Ho alcuni moduli e voglio che ognuno di loro si abboni agli eventi che dicono loro quando vengono richiesti. Ho iniziato a fare un semplice esempio con sia sottoscritto che editore nella shell. Nessun problema lì. Adesso; quando sposto gli abbonati verso i miei moduli non vengono attivati. Ciò che è ancora più strano è che in realtà ha funzionato un paio di volte, tutte cose che sono stato sospeso in una pausa. Quindi mi sembra di essere in condizioni di gara, ma non capisco perché.Aggregazione evento Prism - sottoscrittore non attivato
Presupposto fatto: Non ho bisogno di configurare IEventAggregator ovunque - ad es. registrarsi nel contenitore IoC? Questo è incorporato in Prism tale che ho solo un'istanza dell'aggregatore di eventi, giusto?
Quindi, la domanda è fondamentalmente come/dove/quando dovrei impostare i miei abbonati. C'è un ordine specifico su cose ecc? Nel mio esempio semplificato ho un modulo MyModule. Il programma di avvio automatico aggiungerà MyModule al catalogo - che lo rende inizializzato:
catalog.AddModule(typeof(MyModule));
MyModule memorizzerà l'aggregatore e di utilizzare per la sottoscrizione al MyModuleRequestedEvent. Utilizza anche un registro di menu per registrarsi nel menu dell'applicazione. L'idea è che alla fine, facendo clic sul menu, l'evento venga attivato, notificando a MyModule che è stato richiesto. Quindi voglio che sia la responsabilità di MyModule per capire cosa fare ulteriormente.
public MyModule(IEventAggregator aggregator, IApplicationMenuRegistry menu)
{
_applicationMenu = menu;
_aggregator = aggregator;
}
public void Initialize()
{
var evnt = _aggregator.GetEvent<MyModuleRequestedEvent>();
evnt.Subscribe(MyModuleRequested);
_applicationMenu.RegisterMenuItem("MyModule", evnt);
}
public void MyModuleRequested(bool b)
{
MessageBox.Show("MyModule requested");
}
Ora ho un pulsante nella shell che pubblicherà questo evento. La shell ottiene lo stesso aggregatore di eventi (?) Quando viene risolto.
public Shell(IEventAggregator aggregator)
{
InitializeComponent();
var evnt = aggregator.GetEvent<MyModuleRequestedEvent>();
EventTriggerButton.Click += (s, e) => evnt.Publish(true);
}
Note:
- hanno verificato che l'evento viene pubblicato. Anche l'aggiunta di un sottoscrittore nella shell renderà questo sottoscrittore ricevere l'evento.
- Ancora; l'utente di MyModule non viene attivato. Tuttavia, è - stranamente - stato in alcune occasioni.
- Non uso l'input per l'evento. Sembrava che avessi bisogno di un po 'di input, quindi sono andato con un bool fittizio. Posso liberarmi di questo ..?
Sembra che tu stia ricevendo due EventAggregator; usa il debugger per creare un ID oggetto per entrambi, così puoi controllarlo e farcelo sapere. – GraemeF
Grazie per il suggerimento! Lo ha fatto, ed è in effetti lo stesso EventAggregator che viene utilizzato per iscriversi nel modulo e per la pubblicazione. Entra prima nel costruttore di Shell. Ha fatto il "Crea ID oggetto". Ho ottenuto 1 #. Quindi premi il punto di interruzione in MyModule.Initialize e verifica che l'aggregatore abbia ID 1 #. Inoltre, quando si preme il pulsante per attivare la pubblicazione, vedo che l'aggregatore utilizzato è 1 #. – stiank81