2

私はしばしばそれについて疑問に思っていましたが、それを組み込んだロジックに遭遇したので、先に進んで基本を解読するための助けを得る必要があると思いました. 問題は次のとおりです。複合アプリケーション ライブラリを利用している WPF アプリケーションを見ています。アプリケーションのソース内で、ビューのプレゼンテーションで次のコード行に出くわしました。便宜上、これをプレゼンテーション A と呼びます。

private void OnSomethingChanged(SomeArgumentType arguement)
{
   UnityImplementation.EventAggregator.GetEvent<EventA>().Publish(null);
}

上記のメソッドで Publish メソッドを見たとき、どこかに Subscribe があり、別のクラスにある必要があると直感的に言われました。これをプレゼンテーション B と呼びます。

UnityImplementation.EventAggregator.GetEvent(Of EventA).Subscribe(AddressOf OnSomeEventA)

OnSomeEventA と呼ばれる同じクラスに、いくつかのロジックを持つプライベート関数がありました。

ここでの私の質問は、ここですべてがどのように配線されているかということです。ここで「発行」「購読」によって正確に何が達成されますか? 「何か」が変更されたとき、コンパイラは、イベント ハンドラーのロジックが記述されている別のクラスによって「サブスクライブ」されたイベントを「発行」する OnSomethingChanged のロジックに従う必要があることをどのように認識しますか? このプロセスの根底にある配線を理解することは素晴らしいことです。

ありがとう

4

1 に答える 1

2

GetEvent<T>各イベント ( type パラメーターで識別されるT)に対して最初に呼び出さEventAggregatorれると、そのイベントが発行されたときに呼び出すメソッドの空のリストが作成されます。Publish通常、これはorへの最初の呼び出しの直前に発生Subscribeします(例のように)。

それで:

  • が呼び出されるたびSubscribeに、メソッドがリストに追加されます。
  • Publishが呼び出されるたびに、リストを調べてそれらの呼び出しを行います。

したがって、Publish()プレゼンテーション A で を呼び出すと、呼び出すことによって登録されたすべてのメソッドがSubscribe呼び出されます。この例では、プレゼンテーション B のOnSomeEventAメソッドが含まれます。

メソッドにブレークポイントを設定OnSomeEventAしてスタックを確認してみてください。ソースも利用できることを忘れないでください。

于 2009-11-19T20:07:18.897 に答える