这个让我彻夜难眠。说我有一个简单的界面,像这样:

public interface INotifier
{
    IObservable<string> Messages { get; }
    void SendMessage(string message);
}


如何在内部不使用Subject<string>或等效状态结构的情况下实现此接口?

我并不是说这是一个教条式的辩论,更多的是思想实验。如果这是一个真正的问题,那么我不会再考虑使用主题来做到这一点。我只是想知道是否有人有办法,我没有考虑过他们可以分享并可能扩大我们的集体视野。

最佳答案

查看ISubject<T>的定义(略作简化):

interface ISubject<T> : IObserver<T>, IObservable<T>
{
    void OnValue(T value);
    void OnError(Exception error);
    void OnCompleted();
    IDisposable Subscribe(IObserver<T> observer);
}


现在看一下INotifier的概念上等效的定义:

interface INotifier : IObservable<string>
{
    IDisposable Subscribe(IObserver<string> observer);
    void OnValue(string value);
}


看到问题了吗?您的INotifier准确描述了主题的概念,减去了OnErrorOnCompleted。尽管现在还不是很明显,但是您的问题可以简化为:“如何在没有主题的情况下实现主题?”

在某个时候,订户观察到的每条通知都必须来自某个地方。如果最终的来源是“冷”的,那么您就不需要在任何地方学习主题。如果该最终来源是“热门”,则意味着这些值是从程序外部推送给您的,而不是作为IObservable<T>发出的,您必须使用一个主题。这是不可避免的。在这些情况下,目标是将主题直接放在最终来源。

关于c# - 没有主题的触发/ Release模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34345714/

10-17 02:02