Prism を使用したイベント集約の実装に取り組んでいます。いくつかのモジュールがあり、それぞれが要求されたときに通知するイベントにサブスクライブする必要があります。シェルでサブスクライブとパブリッシャーの両方を使用して、単純な例を作成することから始めました。問題ありません。今; サブスクライバーをモジュールに移動すると、トリガーされません。さらに奇妙なのは、実際に数回機能したことです。そのすべてがブレークポイントで保留されています。そのため、競合状態のように思えますが、その理由はわかりません。
仮定: IEventAggregator をどこにでもセットアップする必要はありません。たとえば、IoC コンテナーに登録しますか? これは Prism に組み込まれているため、イベント アグリゲーターのインスタンスは 1 つしかありません。
したがって、問題は基本的に、サブスクライバーをいつ、どこで、どのように設定する必要があるかです。ものなどに特定の順序はありますか?私の簡単な例では、1 つのモジュール MyModule があります。Bootstrapper は MyModule をカタログに追加し、初期化します。
catalog.AddModule(typeof(MyModule));
MyModule はアグリゲーターを格納し、これを使用して MyModuleRequestedEvent をサブスクライブします。また、メニュー レジストリを使用してアプリケーション メニューに登録します。アイデアは、最終的にメニューをクリックするとイベントがトリガーされ、要求されたことを MyModule に通知するというものです。次に、さらに何をすべきかを理解するのが MyModule の責任であってほしいと思います。
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");
}
これで、シェルにこのイベントを発行するボタンができました。シェルは、解決時に同じ (?) イベント アグリゲーターを取得します。
public Shell(IEventAggregator aggregator)
{
InitializeComponent();
var evnt = aggregator.GetEvent<MyModuleRequestedEvent>();
EventTriggerButton.Click += (s, e) => evnt.Publish(true);
}
ノート:
- イベントが公開されていることを確認しました。シェルにもサブスクライバーを追加すると、このサブスクライバーはイベントを受信します。
- また; MyModule のサブスクライバーはトリガーされません。しかし、奇妙なことに、それは数回ありました。
- イベントへの入力は使用しません。入力型が必要なようだったので、ダミーの bool を使用しました。これを取り除くことはできますか..?