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
- stelle den Type von Message fest
- schau ins Dictionary ob es fuer diesen MessageTyp WeakActions[*] gibt
- teste ob die WeakAction evt. schon disposed/null ist ( != null, IsAlive)
- teste ob der (intended) Recipient dem Target aus der WeakAction[*] entspricht
- 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>.