考虑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,我们有特殊情况下的典型流程,但对于延迟订阅,它会使调试复杂化。
除了您已经实施的这三种方法之外,还有其他选择吗?