是不是建议使用基于行动的观察员?

时间:2014-06-03 17:09:43

标签: c# system.reactive

对于我们这些刚接触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()扩展。这里有陷阱吗?这是错误的方式吗?

2 个答案:

答案 0 :(得分:3)

我曾在许多投资银行工作过,这些政策都是严厉的过时政策; Rx虽然是开源的,甚至银行也允许我拉入源并在本地编译它。你甚至不能这样做吗?

Rx解决了许多非显而易见的问题,这些问题只会在某些情况下发挥作用,因此很难对您的代码发表评论;但如果源代码的想法不起作用,我可以建议你找一个更合理的雇主!

Rx由微软的一些非常聪明的人开发,并且已经在该领域积极使用了好几年了。如果可以,你一定要更加游说。

答案 1 :(得分:3)

在我看来,这是一个非常幼稚的想法。

Rx不仅仅是你所拥有的实现(并且它已经与你拥有的UnSubscribe概念一起破裂了。)

您的实施是否适合

  • 序列化保证
  • 一个经过深思熟虑的并发模型
  • 一个并发模型,可以确定性地进行单元测试并且可以进行大量的spped
  • 取消作为订阅和同时/预定工作的一等公民
  • 使Rx在原始事件模型之外有用的大量运算符。
  • 几十年来在现场测试Rx.NET的人已经通过了
  • 已在Rx代码库中进行了数千次单元测试。
  • 当事情变得比您最初考虑的更复杂时的社区支持

根据James&#39;咨询。退后一步走开。沿着尝试实现IObservable和IObserver的道路是愚蠢的,从长远来看将花费你。如果你的政治要求你需要这样做,我也会寻找新的角色。