したがって、私はSubject
を使用していて、おそらく使用するかどうかわからないので、次のコードに関するいくつかの質問に終わる可能性があります。SelectMany observablesを選択する必要があるとき、正しい方法で考えていますか?
これは私が説明するのが難しいです、私はなぜ、私は専門用語が不足しているのかわかりません。
私がしようとしているのは、いくつかのオブザーバブルを登録することができる1つのタイプです。このタイプを渡して、すべてのオブザーバブルをグループ化し、それから単一のオブザーバブルを公開することができます。
だからこれが正しいならば、私の最初の質問は私は正しい方法で物事を考えていないです感覚を得る、私は思っていたか、それをやってより多くの「反応」方法は何ですか?
これは私があなたにオブザーバブルを登録することができるこの型を持っていることです。この同じタイプでも、私が購読することができる単一のオブザーバブルを公開することになります。
ここでは、コード例を少し説明します。 したがって、SomeTypeWithObservable
は、公開する多くの種類の1つになる可能性があります。IObservable<SomeEvents>
ReactiveTesting
タイプは、すべての観測値をまとめて1つのIObservable<SomEvents>
を公開するタイプです。それは内部Subject<IObservable<SomeEvents>>
に送るRegisterObservable
メソッドがあります。コンストラクタは、私がこのサブジェクトのSelectMany
であるとして公開したいObservableを設定します。私は観測の登録が使用されていないダミーのサブスクリプションを使用しなかった場合は、以下のインプリメンテーションを使用して
は、私が観察を開始するためにダミーのサブスクリプションで次、SelectMany.Publish.RefCount
を実行ReactiveTesting
コンストラクタで、私は気づきました。
だから私の2番目の質問が観測を始めるためにダミーのサブスクリプションを持ってOKというコードである、または私は私がちょうど公開から接続していたし、すぐ後にそれを接続したコメントで下にいた何をすべき、または両方とも間違っていて、その場合、誰かが私を正しい方向に向けることができますか?
私の第3の質問件名を使用する必要がありますか?
サブスクリプションよりも先にRegisterObservable
と連絡し、ダミーSubscribe
またはConnect
を入れないと、トリガーされたイベントは監視されません。
私の第4の質問誰かが後者を説明できますか? 私は、それがPublish
とRefCount
であるため、Observableから始まるサブスクリプションがあるまでは何もしないと考えています。
コード
--Edited - だから私の最初の質問は、私が感じIを取得し、私はReactiveTesting
enum SomeEvents
{
event1,
event2,
event3,
event4
}
interface ISomeTypeWithObservable
{
IObservable<SomeEvents> SomeObservableEvents { get; }
}
class SomeTypeWithObservable2 : ISomeTypeWithObservable
{
private event EventHandler SpecialEvent;
public SomeTypeWithObservable2()
{
var observableFromSpecialEvent = Observable.FromEventPattern(h => SpecialEvent += h, h => SpecialEvent -= h).Select(x => SomeEvents.event2);
SomeObservableEvents = Observable.Create<SomeEvents>(observer =>
{
return observableFromSpecialEvent.Subscribe(observer);
})
.Publish()
.RefCount();
}
public IObservable<SomeEvents> SomeObservableEvents { get; }
public void TriggerEvent()
{
SpecialEvent.Invoke(this, new EventArgs());
}
}
class SomeTypeWithObservable : ISomeTypeWithObservable
{
private event EventHandler SpecialEvent;
public SomeTypeWithObservable()
{
var observableFromSpecialEvent = Observable.FromEventPattern(h => SpecialEvent += h, h => SpecialEvent -= h).Select(x => SomeEvents.event1);
SomeObservableEvents = Observable.Create<SomeEvents>(observer =>
{
return observableFromSpecialEvent.Subscribe(observer);
})
.Publish()
.RefCount();
}
//Some code in here that will produce things to observe, maybe Observable.FromEventPattern...
public IObservable<SomeEvents> SomeObservableEvents { get; }
public void TriggerEvent()
{
SpecialEvent.Invoke(this, new EventArgs());
}
}
class ReactiveTesting
{
private Subject<IObservable<SomeEvents>> _innerEvents = new Subject<IObservable<SomeEvents>>();
public IObservable<SomeEvents> AllEvents;
public ReactiveTesting()
{
AllEvents = _innerEvents.SelectMany(x => x).Publish().RefCount();
AllEvents.Subscribe(next => { }, exception => { },() => { });
//This instead of the above??
//var connectableObservable = _innerEvents.SelectMany(x => x).Publish();
//AllEvents = connectableObservable;
//connectableObservable.Connect();
}
public void RegisterObservable(ISomeTypeWithObservable someTypeWithObservable)
{
_innerEvents.OnNext(someTypeWithObservable.SomeObservableEvents);
}
}
class Program
{
static void Main(string[] args)
{
var reactiveTesting = new ReactiveTesting();
var someTypeWithObservable = new SomeTypeWithObservable();
var someTypeWithObservable2 = new SomeTypeWithObservable2();
reactiveTesting.AllEvents.Subscribe(next => Console.WriteLine(string.Format("Subscriber 1 - {0}", next.ToString("G"))));
reactiveTesting.AllEvents.Subscribe(next => Console.WriteLine(string.Format("Subscriber 2 - {0}", next.ToString("G"))));
reactiveTesting.RegisterObservable(someTypeWithObservable);
reactiveTesting.RegisterObservable(someTypeWithObservable2);
someTypeWithObservable.TriggerEvent();
someTypeWithObservable.TriggerEvent();
someTypeWithObservable.TriggerEvent();
someTypeWithObservable2.TriggerEvent();
someTypeWithObservable2.TriggerEvent();
someTypeWithObservable2.TriggerEvent();
Console.WriteLine("Press key...");
Console.ReadLine();
}
}
お返事ありがとうございます:-)おそらく私は何をしたいのか分かりませんでした。 ReactiveTestingは本質的にシングルトンであり、これらすべての観測値をグループ化して1を生成することができます。もう一度、Rxに関連して正しい方法でこの解決策について考えるつもりはありません。また、サブスクリプションは、新しいobservableを登録/マージする前に発生する可能性があります。私はPublishを使うと思ったので、登録よりも遅れて購読しても同じ観察可能なものを観察することができます。 – RichardWilliams