这个让我彻夜难眠。说我有一个简单的界面,像这样:
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
准确描述了主题的概念,减去了OnError
和OnCompleted
。尽管现在还不是很明显,但是您的问题可以简化为:“如何在没有主题的情况下实现主题?”在某个时候,订户观察到的每条通知都必须来自某个地方。如果最终的来源是“冷”的,那么您就不需要在任何地方学习主题。如果该最终来源是“热门”,则意味着这些值是从程序外部推送给您的,而不是作为
IObservable<T>
发出的,您必须使用一个主题。这是不可避免的。在这些情况下,目标是将主题直接放在最终来源。关于c# - 没有主题的触发/ Release模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34345714/