RXを使用して多数のパブリッシャから通知を送信するシステムをモデル化しようとしています。RXで複数のカスタムオブザーバをマージする
ITopicObservableとITopicObserverの2つのカスタムインターフェイスを使用して、IObservableインターフェイスとIObserverインターフェイスを除いて、実装クラスが他のプロパティとメソッドを持つことをモデル化しました。
問題は私が考えているのは、複数のオブザーバブルを一緒にマージし、オブザーバに登録して、すべてのマージされたオブザーバからの更新を提供できるということです。しかし、 "issue"コメントのコードでは、無効なキャスト例外がスローされます。
ユースケースは、ボックス内の温度をそれぞれ監視する複数の独立したセンサーです。たとえば、すべてのレポートを1つの温度レポートに集約し、その後温度ヘルスモニタによってサブスクライブします。
私はここで何が欠けていますか?または、RXを使用してシナリオを実装するより良い方法はありますか?
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
}
}
ありがとうございました!インターフェースの使用に関する質問に答えるために、たとえば、システムのさまざまな部分を監視する多数の温度プローブがあります。これらのプローブのそれぞれは固有のID /名前を持っています。温度をファイルに独立して記録します。アグリゲーショントピックスが入っているシステム全体を効果的に監視する集約温度モニタがあります。アグリゲーショントピックスの情報に基づいて、オン/オフを切り替える意思決定を行う別のエンティティ(オブザーバ)もあります。このすべてはログに記録されます。これを達成するためのよりクリーンな方法がありますか? – Bernard
@Bernard - はい、もっと簡単な方法があります。インターフェイスを拡張しないでください。代わりに、生成されたID、名前、および値を含むカスタムオブジェクトを作成する必要があります。次に、このカスタムオブジェクトを返すオブザーバブルを作成します。これは非常に簡単にマージできます。あなたは本当にこれを別の質問として尋ねるべきです。私はあなたに答えを与えることを嬉しく思っています。もしあなたがすれば、温度プローブが値を出す時を知る方法を詳しく教えてください(コードも示しています)。 – Enigmativity
私は新しい質問をhttp://stackoverflow.com/questions/36723106/building-a-sensor-monitoring-system-using-rxとして作成しました。助けてくれてありがとう! – Bernard