Frank (no reg): vb.net - Unbekanntes Event. IF Exists AddHandler. Hilfe.

Beitrag lesen

Hi, ein MessageBus (ein einfacher, den man wunderbar innerhalb einer Anwendung verwenden kann) ist ein Service (meistens als Singleton) welcher einen Methodenaufruf, z.b.

MessageBus mb = MessageBus.GetDefault();
mb.Publish<string>(null, "This is your message");
// Signatur: Publish<string>(object recipient, string message);

an alle Interessenten/Subscriber ueber Delegates (wie eigentlich auch bei Events) weiterreicht.

In deinem Plugin wuerdest also nach dem Laden quasi folgendes ausfuehren:

MessageBus mb = MessageBus.GetDefault();
mb.Subscribe<YourMessageType>(this, (msg) => this.ExecuteThisMethodWhenAMessageArrives(msg));

und spaeter wieder
mb.Unsubscribe(this);

Die Signatur der Subscribe Methode
Subscribe<TMessageType>(object recipient, Action<TMessageType> actionOnMessageArrival);

In der Methode verwaltest du einfach ein Dictionary aus MessageTypes (Dictionary Key) und Listen von WeakAction[*] Referenzen.

Alles was du dann in der Publish Methode machst ist

  1. stelle den Type von Message fest
  2. schau ins Dictionary ob es fuer diesen MessageTyp WeakActions[*] gibt
  3. teste ob die WeakAction evt. schon disposed/null ist ( != null, IsAlive)
  4. teste ob der (intended) Recipient dem Target aus der WeakAction[*] entspricht
  5. fuehre die WeakAction aus: (WeakAction as IExecWithObject).ExecWithObject(yourmessage);

und fertig.
Universell, flexibel einsetzbar im Hauptteil des Programms und genauso in Plugins. Geringer Overhead, auf- und abwaertskompatibel ...

Aufwand: ca. 2,5 Std, ca. 250 LoC

Ciao, Frank

[*]WeakAction und IExecWithObject sind einfach ein Wrapper um WeakReference und Action<T>.