C# 是否不建议使用基于操作的观察者?

C# 是否不建议使用基于操作的观察者?,c#,system.reactive,C#,System.reactive,对于我们这些刚刚接触到IObserver和IObservable强大功能的人来说,我们需要记住这两个接口是.NET核心的一部分(字面意思是mscorlib)。这是完全不同的,它可以被可悲地视为“非标准”。出于可悲的政治原因,我有动机将Rx限制在一个VisualStudio项目中。这实际上迫使我想到这样的东西: public class CommunicatorObserver : IObserver<CommunicatorResult> { public Communica

对于我们这些刚刚接触到
IObserver
IObservable
强大功能的人来说,我们需要记住这两个接口是.NET核心的一部分(字面意思是
mscorlib
)。这是完全不同的,它可以被可悲地视为“非标准”。出于可悲的政治原因,我有动机将Rx限制在一个VisualStudio项目中。这实际上迫使我想到这样的东西:

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;
}
公共类通信orobserver:IObserver
{
公共通信或观察者(ObservableNext行动)
{
this.SetActions(actionForObservableNext,null,null);
}
公共通信或观察者(Action Action For ObserveNext,Action Action For ObserveError)
{
this.SetActions(actionForObservableNext,actionForObservableError,null);
}
公共通信或观察者(观察者下一步行动、观察者下一步行动、观察者下一步行动、观察者下一步行动已完成)
{
此.SetActions(actionForObservableNext、actionForObservableError、actionForObservableCompleted);
}
未完成的公共无效()
{
如果(this.\u actionForObservableCompleted!=null)this.\u actionForObservableCompleted.Invoke();
}
公共无效OnError(异常错误)
{
如果(this.\u actionforobserveError!=null)this.\u actionforobserveError.Invoke(错误);
}
public void OnNext(通信或结果值)
{
如果(this.\u actionforobservenext!=null)this.\u actionforobservenext.Invoke(value);
}
公共虚拟空订阅(IObservable提供程序)
{
if(provider==null)返回;
this.\u unsubscriber=provider.Subscribe(this);
}
公共虚拟无效取消订阅()
{
如果(this.\u unsubscriber!=null)this.\u unsubscriber.Dispose();
}
无效设置操作(操作actionForObservableNext、操作actionForObservableError、操作actionForObservableCompleted)
{
这.\u actionForObservableCompleted=actionForObservableCompleted;
这是.\u actionForObservableError=actionForObservableError;
这是._actionforobservenext=actionforobservenext;
}
行动——可观察到的行动已完成;
行动——可观察错误的行动;
动作(actionforobserveNext);
IDisposable _退订者;
}

我的目的是编写我自己的通用但特定于域的观察者,并避免在整个解决方案中使用Rx
.Subscribe()
扩展。这里有什么陷阱吗?这是不是走错了路?

我在许多投资银行工作过,他们的政策都是如此严厉、过时;Rx是开源的,甚至银行也允许我从源代码中获取并在本地编译它。你就不能那样做吗

Rx解决了许多不明显的问题,这些问题只会在某些场景中出现,因此很难对代码进行评论;但是如果源代码的想法不可行,我可以建议你找一个更合理的雇主


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

我在许多投资银行工作过,他们的政策都是如此严厉过时;Rx是开源的,甚至银行也允许我从源代码中获取并在本地编译它。你就不能那样做吗

Rx解决了许多不明显的问题,这些问题只会在某些场景中出现,因此很难对代码进行评论;但是如果源代码的想法不可行,我可以建议你找一个更合理的雇主


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

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

Rx不仅仅是您在那里的实现(而且它似乎已经与您的退订概念相冲突)

你的实现能满足你的需求吗

  • 序列化保证
  • 经过深思熟虑的并发模型
  • 一种并发模型,可以在很大程度上进行单元测试
  • 以一等公民身份取消订阅和同时/计划工作
  • 使Rx在原始事件模型之外更有用的成堆运算符
  • 经过几十年的现场测试,Rx.NET已经完成
  • Rx代码库中已有数千个单元测试
  • 当事情变得比您最初考虑的更复杂时,社区支持

按照詹姆斯的建议。退后一步,走开。在试图实现IObservable和IObserver的道路上走下去是愚蠢的,从长远来看,这会让你付出代价。如果你的政治要求你必须这样做,我也会寻找一个新的角色。

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

Rx不仅仅是您在那里的实现(而且它似乎已经与您的退订概念相冲突)

你的实现能满足你的需求吗

  • 序列化保证
  • 经过深思熟虑的并发模型
  • 一种并发模型,可以在很大程度上进行单元测试
  • 以一等公民身份取消订阅和同时/计划工作
  • 使Rx在原始事件模型之外更有用的成堆运算符
  • 经过几十年的现场测试,Rx.NET已经完成
  • Rx代码库中已有数千个单元测试
  • 当事情变得比您最初考虑的更复杂时,社区支持
按照詹姆斯的建议。退后一步,走开。在试图实现IObservable和IObserver的道路上走下去是愚蠢的,从长远来看,这会让你付出代价。如果你的政治决定你需要做