对于我们这些刚接触IObserver<T>
和IObservable<T>
强大力量的人,我们需要记住这两个接口是.NET核心的一部分(字面意思是mscorlib
})。这与Reactive Extensions NuGet package完全不同,{{3}}可以被遗忘为“非标准”。出于可怜的政治原因,我有动力将Rx限制在一个 Visual Studio项目中。这有效地迫使我想出这样的事情:
public class CommunicatorObserver : IObserver<CommunicatorResult>
{
public CommunicatorObserver(Action<CommunicatorResult> actionForObservableNext)
{
this.SetActions(actionForObservableNext, null, null);
}
public CommunicatorObserver(Action<CommunicatorResult> actionForObservableNext, Action<Exception> actionForObservableError)
{
this.SetActions(actionForObservableNext, actionForObservableError, null);
}
public CommunicatorObserver(Action<CommunicatorResult> actionForObservableNext, Action<Exception> actionForObservableError, Action actionForObservableCompleted)
{
this.SetActions(actionForObservableNext, actionForObservableError, actionForObservableCompleted);
}
public void OnCompleted()
{
if (this._actionForObservableCompleted != null) this._actionForObservableCompleted.Invoke();
}
public void OnError(Exception error)
{
if (this._actionForObservableError != null) this._actionForObservableError.Invoke(error);
}
public void OnNext(CommunicatorResult value)
{
if (this._actionForObservableNext != null) this._actionForObservableNext.Invoke(value);
}
public virtual void Subscribe(IObservable<CommunicatorResult> provider)
{
if (provider == null) return;
this._unsubscriber = provider.Subscribe(this);
}
public virtual void Unsubscribe()
{
if (this._unsubscriber != null) this._unsubscriber.Dispose();
}
void SetActions(Action<CommunicatorResult> actionForObservableNext, Action<Exception> actionForObservableError, Action actionForObservableCompleted)
{
this._actionForObservableCompleted = actionForObservableCompleted;
this._actionForObservableError = actionForObservableError;
this._actionForObservableNext = actionForObservableNext;
}
Action _actionForObservableCompleted;
Action<Exception> _actionForObservableError;
Action<CommunicatorResult> _actionForObservableNext;
IDisposable _unsubscriber;
}
我的目的是编写我自己的,通用但特定于域的Observer,并避免在我的解决方案中使用Rx .Subscribe()
扩展。这里有陷阱吗?这是错误的方式吗?
答案 0 :(得分:3)
我曾在许多投资银行工作过,这些政策都是严厉的过时政策; Rx虽然是开源的,甚至银行也允许我拉入源并在本地编译它。你甚至不能这样做吗?
Rx解决了许多非显而易见的问题,这些问题只会在某些情况下发挥作用,因此很难对您的代码发表评论;但如果源代码的想法不起作用,我可以建议你找一个更合理的雇主!
Rx由微软的一些非常聪明的人开发,并且已经在该领域积极使用了好几年了。如果可以,你一定要更加游说。
答案 1 :(得分:3)
在我看来,这是一个非常幼稚的想法。
Rx不仅仅是你所拥有的实现(并且它已经与你拥有的UnSubscribe概念一起破裂了。)
您的实施是否适合
根据James&#39;咨询。退后一步走开。沿着尝试实现IObservable和IObserver的道路是愚蠢的,从长远来看将花费你。如果你的政治要求你需要这样做,我也会寻找新的角色。