2014-02-17 16 views
7

Also ich lese überall, dass die Verwendung von Subject<T> ist "schlecht" - und ich stimme der Argumentation.Wie vermeidet man die Verwendung von Themen in RX

Allerdings versuche ich, dies der beste Weg zu vermeiden, es zu verwenden und ein Beispiel zu haben.

Derzeit habe ich eine abstrakte Klasse für meine persistente Konfigurationsklassen, die eine geschützte Save()-Methode darauf hat, die aufgerufen wird, wenn eine Eigenschaft ändern sollte die Klasse beibehalten werden. Diese Nachricht pumpt eine Nachricht an eine Subject<T>, die über die Schnittstelle IObservable<T> verfügbar ist, die von den Serialisierungsdiensten überwacht wird und die Klasse serialisiert. Dies schien der offensichtlichste, einfachste und schnellste Weg, dies zu der Zeit zu implementieren.

Also, was wäre der RX-Weg, dies zu tun, ohne ein Thema zu verwenden? Würde ich stattdessen ein Ereignis veröffentlichen und Observable.FromEventPattern() verwenden, um es zu abonnieren? - da dies ein komplizierterer Weg zu sein scheint.

+1

Als eine Frage von Interesse, können Sie mit einigen dieser Argumente verknüpfen? Ich glaube nicht, dass ich genug Rx weiß, um die Frage zu beantworten, aber dies ist das erste Mal, dass ich gehört habe, dass Sie versuchen sollten, 'Subject' zu vermeiden. – shambulator

+2

@shambulator Überprüfen Sie diesen Link für eine kurze Erklärung: http://introtorx.com/Content/v1.0.10621.0/18_UsageGuidelines.html – jnovo

Antwort

9

Es ist nicht so sehr, dass die Verwendung von Subject<T> schlecht ist - hat es eine Möglichkeit, der „die Monade Eingabe“ zu sein - das ist die akademische Art und Weise sagte „ein IObservable<T> zu bekommen“. Du musst irgendwo anfangen.

Das Problem mit Subject<T> entsteht mehr, wenn es von einem Abonnement verwendet wird, anstatt vorhandene Observables zusammen zu verketten. Themen sollten nur an den Rändern Ihrer Rx-Maschinen existieren.

Falls keine der vorgesehenen Eintrittspunkte (z FromEvent, FromEventPattern, FromAsync, Return, ToObservable() usw.) für Sie arbeiten dann Subject<T> mit vollkommen gültig. Und es ist nicht notwendig, zusätzliche Komplexität hinzuzufügen, nur um eines der oben genannten zu verwenden - die meisten von ihnen verwenden trotzdem Subjekte oder subjektähnliche Konstrukte unter dem Deckblatt.

In Ihrem Fall klingt Sounds wie Subject<T> ist in Ordnung. Sie könnten sehen, wie Sie es über AsObservable() aussetzen, um die Implementierungsdetails zu verbergen.

Verwandte Themen