IObservable<T>
次のSubscribe
実装を検討してください。
public IDisposable Subscribe(IObserver<T> observer)
{
if (observer == null)
{
throw new ArgumentNullException("observer");
}
lock (_subscriberSync)
{
var accepted = OnSubscribing(observer); // <------ policy can be applied here
if (!accepted)
{
/* #1 */ return null;
/* #2 */ // return NullSubscription.Instance;
/* #3 */ // throw new SubscriptionRejectedException("reason");
}
// ... perform actual subscription went here
}
}
拒否されたサブスクリプションを確立する方法についてのガイダンスはないようです。理想的には、条件を表すBoolean TrySubscribe(IObserver<T> observer, out IDisposable subscription)
orMaybe<IDisposable> Subscribe(IObserver<T> observer)
が必要ですが、フラグ値または帯域外例外のオプションしかないようです。それぞれに欠点があります。
#1では、私が遭遇したすべてのコードがnullをチェックしていないようで、Resharperの静的分析でさえNotNull
属性を設定しています。
#2ではNullSubscription
、あまり発見できないことを除いて、#1と大差ないaをテストする必要があります(「魔法の」戻り値で典型的です)。
#3では、例外的な状況の典型的なフローがありますが、遅延サブスクリプションの場合、デバッグが複雑になります。
これらの 3 つの方法以外に実装されている方法はありますか?