Versuch, ein System zu modellieren, das Benachrichtigungen von mehreren Herausgebern mit RX sendet.Mehrere benutzerdefinierte Observables in RX zusammenfügen
Ich habe zwei benutzerdefinierte Schnittstellen ITopicObservable und ITopicObserver, um die Tatsache zu modellieren, dass die implementierenden Klassen andere Eigenschaften und Methoden als die IObservable- und IObserver-Schnittstellen haben.
Das Problem, das ich habe, ist, dass mein Denken ist, dass ich in der Lage sein sollte, eine Anzahl von Observablen zusammenzufügen, sie zusammenzufassen und einen Beobachter zu abonnieren, um Updates von allen zusammengeführten Observablen bereitzustellen. Der Code mit dem Kommentar "issue" löst jedoch eine ungültige Cast-Ausnahme aus. Der Anwendungsfall ist eine Anzahl von unabhängigen Sensoren, die zum Beispiel jeweils eine Temperatur in einer Box überwachen, die alle ihre Berichte zu einem Temperaturbericht zusammenfasst, der dann von einem Temperaturzustandsmonitor abonniert wird.
Was fehlt mir hier? Oder gibt es eine bessere Möglichkeit, das Szenario mit RX zu implementieren?
-Code unten
using System;
using System.Reactive.Linq;
using System.Collections.Generic;
namespace test
{
class MainClass
{
public static void Main (string[] args)
{
Console.WriteLine ("Hello World!");
var to = new TopicObserver();
var s = new TopicObservable ("test");
var agg = new AggregatedTopicObservable();
agg.Add (s);
agg.Subscribe (to);
}
}
public interface ITopicObservable<TType>:IObservable<TType>
{
string Name{get;}
}
public class TopicObservable:ITopicObservable<int>
{
public TopicObservable(string name)
{
Name = name;
}
#region IObservable implementation
public IDisposable Subscribe (IObserver<int> observer)
{
return null;
}
#endregion
#region ITopicObservable implementation
public string Name { get;private set;}
#endregion
}
public class AggregatedTopicObservable:ITopicObservable<int>
{
List<TopicObservable> _topics;
private ITopicObservable<int> _observable;
private IDisposable _disposable;
public AggregatedTopicObservable()
{
_topics = new List<TopicObservable>();
}
public void Add(ITopicObservable<int> observable)
{
_topics.Add ((TopicObservable)observable);
}
#region IObservable implementation
public IDisposable Subscribe (IObserver<int> observer)
{
_observable = (ITopicObservable<int>)_topics.Merge();
_disposable = _observable.Subscribe(observer);
return _disposable;
}
#endregion
#region ITopicObservable implementation
public string Name { get;private set;}
#endregion
}
public interface ITopicObserver<TType>:IObserver<TType>
{
string Name{get;}
}
public class TopicObserver:ITopicObserver<int>
{
#region IObserver implementation
public void OnNext (int value)
{
Console.WriteLine ("next {0}", value);
}
public void OnError (Exception error)
{
Console.WriteLine ("error {0}", error.Message);
}
public void OnCompleted()
{
Console.WriteLine ("finished");
}
#endregion
#region ITopicObserver implementation
public string Name { get;private set;}
#endregion
}
}
Vielen Dank dafür! Um die Frage nach der Verwendung der Schnittstelle zu beantworten, haben wir zum Beispiel eine Anzahl von Temperaturfühlern, die verschiedene Teile eines Systems überwachen. Jede dieser Sonden hat eine eindeutige ID/einen eindeutigen Namen. Sie protokollieren ihre Temperaturen unabhängig voneinander in der Datei. Es würde einen aggregierten Temperaturmonitor geben, der effektiv das gesamte System überwacht, wo ein AggregatedTopic ins Spiel kommt. Es würde auch eine andere Entität (Observer) geben, die basierend auf den AggregatedTopic-Informationen entscheiden würde, Dinge ein- oder auszuschalten. All dies mit Protokollierung. Gibt es einen saubereren Weg, dies zu erreichen? – Bernard
@Bernard - Ja, es gibt einen viel einfacheren Weg, es zu tun. Sie sollten die Schnittstellen nicht erweitern. Stattdessen sollten Sie ein benutzerdefiniertes Objekt erstellen, das die ID, den Namen und den produzierten Wert enthält. Dann erstellen Sie Observables, die dieses benutzerdefinierte Objekt zurückgeben - das Sie sehr einfach zusammenführen können. Sie sollten das wirklich als separate Frage stellen und ich würde Ihnen gerne eine Antwort geben. Wenn Sie das tun können, geben Sie bitte an, wie Sie wissen, wann die Temperaturfühler einen Wert erzeugen (zeigt auch den Code an). – Enigmativity
Ich habe eine neue Frage http://stackoverflow.com/questions/36723106/building-a-sensor-monitoring-system-using-rx wie angefordert erstellt. Vielen Dank für die Hilfe! – Bernard