2 Stimmen

Verfolgung von PRISM/CAL-Ereignissen (bewährte Praxis?)

Gut,

Diese Frage richtet sich an Leute, die sich entweder mit PRISM auskennen oder über magische Fähigkeiten verfügen, die mir (noch) fehlen. Der Hintergrund ist einfach: Prism erlaubt die Deklaration von Ereignissen, die der Benutzer abonnieren oder veröffentlichen kann. Im Code sieht das so aus:

  _eventAggregator.GetEvent<LayoutChangedEvent>().Subscribe(UpdateUi, true);
  _eventAggregator.GetEvent<LayoutChangedEvent>().Publish("Some argument");

Das ist schön, vor allem, weil diese Ereignisse stark typisiert sind, und die Deklaration ist ein Kinderspiel:

public class LayoutChangedEvent : CompositePresentationEvent<string>
{
}

Aber jetzt kommt der schwierige Teil: Ich möchte die Ereignisse auf irgendeine Weise zurückverfolgen. Ich hatte die Idee, mit einem Lambda-Ausdruck zu abonnieren, der eine einfache Protokollnachricht aufruft. Funktionierte perfekt in WPF, aber in Silverlight gibt es einige Methode Zugriffsfehler (nahm mich einige Zeit, um den Grund herauszufinden). Wenn Sie für sich selbst sehen wollen, versuchen Sie dies in Silverlight:

eA.GetEvent<VideoStartedEvent>().Subscribe(obj => TraceEvent(obj, "vSe", log));

Wenn dies möglich wäre, würde ich mich freuen, denn dann könnte ich alle Ereignisse mit einer einzigen Zeile zum Abonnieren leicht verfolgen. Aber das ist nicht der Fall... Die Alternative ist, für jedes Ereignis eine andere Funktion zu schreiben und diese Funktion den Ereignissen zuzuweisen. Warum verschiedene Funktionen? Nun, ich muss wissen, WELCHES Ereignis veröffentlicht wurde. Wenn ich die gleiche Funktion für zwei verschiedene Ereignisse verwende, erhalte ich nur die Nutzlast als Argument. Ich habe keine Möglichkeit, herauszufinden, welches Ereignis die Tracing-Meldung verursacht hat.

Ich habe es versucht:

  • Reflection verwenden, um das auslösende Ereignis zu erhalten (funktioniert nicht)
  • Verwendung eines Konstruktors im Ereignis, damit jedes Ereignis sich selbst verfolgen kann (nicht zulässig)

Gibt es noch andere Ideen? Chris

PS: Das Schreiben dieses Textes hat mich wahrscheinlich länger gekostet als das Schreiben von 20 Funktionen für meine 20 Events, aber ich gebe nicht auf :-) Ich hatte gerade die Idee, Postsharp zu verwenden, das würde wahrscheinlich funktionieren (obwohl ich nicht sicher bin, vielleicht habe ich am Ende nur Informationen über die Basisklasse)... Kniffliges und so unwichtiges Thema...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X