Trace PRISM / CAL events (best practice?)

Posted by Christian on Stack Overflow See other posts from Stack Overflow or by Christian
Published on 2009-10-07T00:24:49Z Indexed on 2010/03/28 14:23 UTC
Read the original article Hit count: 435

Filed under:
|
|

Ok,

this question is for people with either a deep knowledge of PRISM or some magic skills I just lack (yet). The Background is simple: Prism allows the declaration of events to which the user can subscribe or publish. In code this looks like this:

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

Now this is nice, especially because these events are strongly typed, and the declaration is a piece of cake:

public class LayoutChangedEvent : CompositePresentationEvent<string>
{
}

But now comes the hard part: I want to trace events in some way. I had the idea to subscribe using a lambda expression calling a simple log message. Worked perfectly in WPF, but in Silverlight there is some method access error (took me some time to figure out the reason).. If you want to see for yourself, try this in Silverlight:

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

If this would be possible, I would be happy, because I could easily trace all events using a single line to subscribe. But it does not... The alternative approach is writing a different functions for each event, and assign this function to the events. Why different functions? Well, I need to know WHICH event was published. If I use the same function for two different events I only get the payload as argument. I have now way to figure out which event caused the tracing message.

I tried:

  • using Reflection to get the causing event (not working)
  • using a constructor in the event to enable each event to trace itself (not allowed)

Any other ideas? Chris

PS: Writing this text took me most likely longer than writing 20 functions for my 20 events, but I refuse to give up :-) I just had the idea to use postsharp, that would most likely work (although I am not sure, perhaps I end up having only information about the base class).. Tricky and so unimportant topic...

© Stack Overflow or respective owner

Related posts about c#

Related posts about prism