Laden...

Events dynamisch auslösen

Erstellt von Brian_Piffler vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.002 Views
B
Brian_Piffler Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren
Events dynamisch auslösen

Hallo Forum,

Ich bin neu in der .net welt und auf ein kleines Problem gestoßen.
Ich möchte gern in meinem Programm eine Klasse haben welche als gateway fungiert.
diese soll auf nachrichten warten und dann über ein event diese an andere Objekte weiterleiten.

Klappt auch soweit, nun möchte ich aber, dass der Inhalt der Nachricht das Objekt beeinflusst.
Also mal ein beispiel:

In der Nachricht steht : "BOB:Hallo"
Momentan erhalten alle Objekte die Nachricht "BOB:Hallo" und checken dann ob Sie BOB sind. (der Name wir beim erstellen des Objektes festgelegt)

Ich möchte aber das die gateway Klasse checkt ob ein BOB Objekt aboniert hat und dann nur an dieses "Hallo" weiterleitet.

In python würde ich einfach dem gateway die Funktion samt einem Namen in einem dict übergeben.
Aber wie löse ich das in c#?

Ich hoffe es war halbwegs verständlich.
Vielen dank schonmal.

3.003 Beiträge seit 2006
vor 5 Jahren

Aber wie löse ich das in c#?

So:

Momentan erhalten alle Objekte die Nachricht "BOB:Hallo" und checken dann ob Sie BOB sind. (der Name wir beim erstellen des Objektes festgelegt)

Events entkoppeln den Sender von den Empfängern. Der Sender hat also keine Ahnung, wer ihm alles zuhört. Entsprechend kann er auch nicht wissen, wen die Nachricht interessiert.

Was du möchtest, ist, dass der Sender eine Nachricht an einen bestimmten Empfänger schickt. Dafür musst du ihm den Empfänger bekannt machen, i.e. im einfachsten Fall als Member. Dafür ist die Kopplung dann wieder da.

Also entweder prüfen die Empfänger die erhaltene Nachricht (und erhalten u.U. Nachrichten, die nicht für sie bestimmt sind), oder der Absender stellt eine Schnittstelle zur Verfügung, mit der die Empfänger sich bei ihm so anmelden, dass er sie kennt und zuordnen kann. Eins von beiden.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

B
Brian_Piffler Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren

oder der Absender stellt eine Schnittstelle zur Verfügung, mit der die Empfänger sich bei ihm so anmelden, dass er sie kennt und zuordnen kann. Eins von beiden.

Wie setzt man sowas am sinnigsten um ? Ich denke ich war ein wenig auf dem Holzweg. An Sich können sich ja beide Klassen kennen und aufeinander zugreifen. Ich möchte ja keine Schnitstelle für eine dritte Klasse schaffen.

301 Beiträge seit 2009
vor 5 Jahren

Von den Abhängigkeiten her sollte es besser so aussehen, dass nur eine Klasse die andere kennt aber dann nicht mehr umgekehrt. Sprich -> Keine zirkulären Abhängigkeiten bilden!

Was du suchst ist das Observer Muster -> Observer pattern

Dazu gibt es mittlerweile mehrere verschiedene Umsetzungen.

Eine in C# integrierte Umsetzung des Observer Musters sind Events. https://docs.microsoft.com/de-de/dotnet/standard/events/

Es gibt aber auch noch viele andere Umsetzungen z.B. mit Reactive Extensions ->
http://reactivex.io/

1.029 Beiträge seit 2010
vor 5 Jahren

oder der Absender stellt eine Schnittstelle zur Verfügung, mit der die Empfänger sich bei ihm so anmelden, dass er sie kennt und zuordnen kann. Eins von beiden.

Wie setzt man sowas am sinnigsten um ? Ich denke ich war ein wenig auf dem Holzweg. An Sich können sich ja beide Klassen kennen und aufeinander zugreifen. Ich möchte ja keine Schnitstelle für eine dritte Klasse schaffen.

Naja - wenn du das so willst - dann solltest du eben dein Event nicht öffentlich machen - sondern vielmehr Methoden für Subscribe / Unsubscribe anbieten, die es erforderlich machen, dass diese neben dem Delegaten - eben auch eine Art Identifier angeben müssen. Diese Wertpaare (Identifier + Delegate) kannst du ja dann problemlos in einem Dictionary oder einer List<KeyValuePair<>> abspeichern. Und wenn dann eine Nachricht kommt - schaust du eben in dieser Liste nach welchen Delegaten du eigentlich ausführen möchtest.

Persönlich würde ich wohl allerdings eher auf ReactiveX setzen - und schlicht bei den Listenern einen Filter einbauen.

LG

B
Brian_Piffler Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren

Super, habs hinbekommen, mir hat wohl nur der Denkanstoß gefehlt.
Danke für die Hilfe =)